blob: a0fe8fc530187d9be67864a90216836d2c100bbf [file] [log] [blame]
Ian Rogersdf20fe02011-07-20 20:34:16 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_JNI_INTERNAL_H_
4#define ART_SRC_JNI_INTERNAL_H_
5
6#include "jni.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07007
Elliott Hughes410c0c82011-09-01 17:58:25 -07008#include "heap.h"
Elliott Hughes6c1a3942011-08-17 15:00:06 -07009#include "indirect_reference_table.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070010#include "macros.h"
Elliott Hughesbbd76712011-08-17 10:25:24 -070011#include "reference_table.h"
Elliott Hughesa0957642011-09-02 14:27:33 -070012#include "runtime.h"
Ian Rogersdf20fe02011-07-20 20:34:16 -070013
Elliott Hughes0af55432011-08-17 18:37:28 -070014#include <string>
15
Ian Rogersdf20fe02011-07-20 20:34:16 -070016namespace art {
17
Elliott Hughes814e4032011-08-23 12:07:56 -070018class ClassLoader;
Elliott Hughes79082e32011-08-25 12:07:32 -070019class Libraries;
20class Method;
Elliott Hughes18c07532011-08-18 15:50:51 -070021class Mutex;
Elliott Hughes18c07532011-08-18 15:50:51 -070022class Thread;
Ian Rogersdf20fe02011-07-20 20:34:16 -070023
Elliott Hughesa2501992011-08-26 19:39:54 -070024void JniAbort(const char* jni_function_name);
25
Elliott Hughesbf86d042011-08-31 17:53:14 -070026template<typename T> T Decode(JNIEnv*, jobject);
Elliott Hughescf4c6c42011-09-01 15:16:42 -070027template<typename T> T AddLocalReference(JNIEnv*, const Object*);
Elliott Hughesbf86d042011-08-31 17:53:14 -070028
Elliott Hughes69f5bc62011-08-24 09:26:14 -070029struct JavaVMExt : public JavaVM {
Elliott Hughesa0957642011-09-02 14:27:33 -070030 JavaVMExt(Runtime* runtime, Runtime::ParsedOptions* options);
Elliott Hughesde69d7f2011-08-18 16:49:37 -070031 ~JavaVMExt();
Elliott Hughes0af55432011-08-17 18:37:28 -070032
Elliott Hughes75770752011-08-24 17:52:38 -070033 /**
34 * Loads the given shared library. 'path' is an absolute pathname.
Elliott Hughes0af55432011-08-17 18:37:28 -070035 *
Elliott Hughes75770752011-08-24 17:52:38 -070036 * Returns 'true' on success. On failure, sets 'detail' to a
37 * human-readable description of the error.
Elliott Hughes0af55432011-08-17 18:37:28 -070038 */
Elliott Hughes75770752011-08-24 17:52:38 -070039 bool LoadNativeLibrary(const std::string& path, ClassLoader* class_loader, std::string& detail);
Elliott Hughesbbd76712011-08-17 10:25:24 -070040
Elliott Hughes79082e32011-08-25 12:07:32 -070041 /**
42 * Returns a pointer to the code for the native method 'm', found
43 * using dlsym(3) on every native library that's been loaded so far.
44 */
45 void* FindCodeForNativeMethod(Method* m);
46
Elliott Hughes410c0c82011-09-01 17:58:25 -070047 void VisitRoots(Heap::RootVisitor*, void*);
48
Elliott Hughesf2682d52011-08-15 16:37:04 -070049 Runtime* runtime;
Elliott Hughesbbd76712011-08-17 10:25:24 -070050
Elliott Hughesa2501992011-08-26 19:39:54 -070051 // Used for testing. By default, we'll LOG(FATAL) the reason.
52 void (*check_jni_abort_hook)(const std::string& reason);
53
Elliott Hughesa0957642011-09-02 14:27:33 -070054 // Extra checking.
Elliott Hughes515a5bc2011-08-17 11:08:34 -070055 bool check_jni;
Elliott Hughesa2501992011-08-26 19:39:54 -070056 bool force_copy;
Elliott Hughes515a5bc2011-08-17 11:08:34 -070057
Elliott Hughesa0957642011-09-02 14:27:33 -070058 // Extra diagnostics.
59 bool verbose_jni;
60 bool log_third_party_jni;
61 std::string trace;
62
Elliott Hughesc5bfa8f2011-08-30 14:32:49 -070063 // Used to provide compatibility for apps that assumed direct references.
64 bool work_around_app_jni_bugs;
65
Elliott Hughesbbd76712011-08-17 10:25:24 -070066 // Used to hold references to pinned primitive arrays.
Elliott Hughes75770752011-08-24 17:52:38 -070067 Mutex* pins_lock;
Elliott Hughesbbd76712011-08-17 10:25:24 -070068 ReferenceTable pin_table;
Elliott Hughes6c1a3942011-08-17 15:00:06 -070069
70 // JNI global references.
Elliott Hughes18c07532011-08-18 15:50:51 -070071 Mutex* globals_lock;
Elliott Hughes6c1a3942011-08-17 15:00:06 -070072 IndirectReferenceTable globals;
73
74 // JNI weak global references.
Elliott Hughes18c07532011-08-18 15:50:51 -070075 Mutex* weak_globals_lock;
Elliott Hughes6c1a3942011-08-17 15:00:06 -070076 IndirectReferenceTable weak_globals;
Elliott Hughes0af55432011-08-17 18:37:28 -070077
Elliott Hughes79082e32011-08-25 12:07:32 -070078 Mutex* libraries_lock;
79 Libraries* libraries;
Elliott Hughesa2501992011-08-26 19:39:54 -070080
81 // Used by -Xcheck:jni.
82 const JNIInvokeInterface* unchecked_functions;
Elliott Hughesf2682d52011-08-15 16:37:04 -070083};
84
Elliott Hughes69f5bc62011-08-24 09:26:14 -070085struct JNIEnvExt : public JNIEnv {
Elliott Hughes75770752011-08-24 17:52:38 -070086 JNIEnvExt(Thread* self, JavaVMExt* vm);
Elliott Hughesc1674ed2011-08-25 18:09:09 -070087 ~JNIEnvExt();
Elliott Hughesbbd76712011-08-17 10:25:24 -070088
Elliott Hughes40ef99e2011-08-11 17:44:34 -070089 Thread* self;
Elliott Hughes75770752011-08-24 17:52:38 -070090 JavaVMExt* vm;
Carl Shapiroea4dca82011-08-01 13:45:38 -070091
Elliott Hughesc5bfa8f2011-08-30 14:32:49 -070092 // Frequently-accessed fields cached from JavaVM.
Elliott Hughes515a5bc2011-08-17 11:08:34 -070093 bool check_jni;
Elliott Hughesc5bfa8f2011-08-30 14:32:49 -070094 bool work_around_app_jni_bugs;
Elliott Hughes515a5bc2011-08-17 11:08:34 -070095
Elliott Hughesa2501992011-08-26 19:39:54 -070096 // How many nested "critical" JNI calls are we in?
97 int critical;
Carl Shapiro2ed144c2011-07-26 16:52:08 -070098
Elliott Hughesbbd76712011-08-17 10:25:24 -070099 // Entered JNI monitors, for bulk exit on thread detach.
Elliott Hughes02b48d12011-09-07 17:15:51 -0700100 ReferenceTable monitors;
Elliott Hughes6c1a3942011-08-17 15:00:06 -0700101
102 // JNI local references.
103 IndirectReferenceTable locals;
Elliott Hughesa2501992011-08-26 19:39:54 -0700104
105 // Used by -Xcheck:jni.
106 const JNINativeInterface* unchecked_functions;
Carl Shapiroea4dca82011-08-01 13:45:38 -0700107};
108
Elliott Hughesa2501992011-08-26 19:39:54 -0700109const JNINativeInterface* GetCheckJniNativeInterface();
110const JNIInvokeInterface* GetCheckJniInvokeInterface();
111
Ian Rogersdf20fe02011-07-20 20:34:16 -0700112} // namespace art
Carl Shapiroea4dca82011-08-01 13:45:38 -0700113
Elliott Hughesb465ab02011-08-24 11:21:21 -0700114std::ostream& operator<<(std::ostream& os, const jobjectRefType& rhs);
115
Ian Rogersdf20fe02011-07-20 20:34:16 -0700116#endif // ART_SRC_JNI_INTERNAL_H_