summaryrefslogtreecommitdiffstats
path: root/vm/JniInternal.h
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2009-11-12 18:45:15 -0800
committerJean-Baptiste Queru <jbq@google.com>2009-11-12 18:45:15 -0800
commit72e93344b4d1ffc71e9c832ec23de0657e5b04a5 (patch)
tree1a08d1e43d54200ea737234d865c4668c5d3535b /vm/JniInternal.h
parentdfd0afbcb08b871e224a28ecb4ed427a7693545c (diff)
downloadandroid_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.tar.gz
android_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.tar.bz2
android_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.zip
eclair snapshot
Diffstat (limited to 'vm/JniInternal.h')
-rw-r--r--vm/JniInternal.h69
1 files changed, 54 insertions, 15 deletions
diff --git a/vm/JniInternal.h b/vm/JniInternal.h
index 79d16ecab..37920caf6 100644
--- a/vm/JniInternal.h
+++ b/vm/JniInternal.h
@@ -74,13 +74,18 @@ typedef struct JavaVMExt {
* Native function return type; used by dvmPlatformInvoke().
*
* This is part of Method.jniArgInfo, and must fit in 3 bits.
+ * Note: Assembly code in arch/<arch>/Call<arch>.S relies on
+ * the enum values defined here.
*/
typedef enum DalvikJniReturnType {
DALVIK_JNI_RETURN_VOID = 0, /* must be zero */
- DALVIK_JNI_RETURN_FLOAT,
- DALVIK_JNI_RETURN_DOUBLE,
- DALVIK_JNI_RETURN_S8,
- DALVIK_JNI_RETURN_S4
+ DALVIK_JNI_RETURN_FLOAT = 1,
+ DALVIK_JNI_RETURN_DOUBLE = 2,
+ DALVIK_JNI_RETURN_S8 = 3,
+ DALVIK_JNI_RETURN_S4 = 4,
+ DALVIK_JNI_RETURN_S2 = 5,
+ DALVIK_JNI_RETURN_U2 = 6,
+ DALVIK_JNI_RETURN_S1 = 7
} DalvikJniReturnType;
#define DALVIK_JNI_NO_ARG_INFO 0x80000000
@@ -93,15 +98,17 @@ typedef enum DalvikJniReturnType {
/*
* Pop the JNI local stack when we return from a native method. "saveArea"
* points to the StackSaveArea for the method we're leaving.
+ *
+ * (This may be implemented directly in assembly in mterp, so changes here
+ * may only affect the portable interpreter.)
*/
INLINE void dvmPopJniLocals(Thread* self, StackSaveArea* saveArea)
{
- if (saveArea->xtra.localRefTop != self->jniLocalRefTable.nextEntry) {
- LOGVV("LREF: popped %d entries (%d remain)\n",
- (int)(self->jniLocalRefTable.nextEntry-saveArea->xtra.localRefTop),
- (int)(saveArea->xtra.localRefTop - self->jniLocalRefTable.table));
- }
- self->jniLocalRefTable.nextEntry = saveArea->xtra.localRefTop;
+#ifdef USE_INDIRECT_REF
+ self->jniLocalRefTable.segmentState.all = saveArea->xtra.localRefCookie;
+#else
+ self->jniLocalRefTable.nextEntry = saveArea->xtra.localRefCookie;
+#endif
}
/*
@@ -114,14 +121,34 @@ INLINE void dvmSetJniEnvThreadId(JNIEnv* pEnv, Thread* self)
}
/*
- * JNI call bridges. Not usually called directly.
+ * JNI call bridges. Not called directly.
+ *
+ * The "Check" versions are used when CheckJNI is enabled.
*/
-void dvmCallJNIMethod(const u4* args, JValue* pResult, const Method* method,
- Thread* self);
-void dvmCallSynchronizedJNIMethod(const u4* args, JValue* pResult,
+void dvmCallJNIMethod_general(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCallJNIMethod_synchronized(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCallJNIMethod_virtualNoRef(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCallJNIMethod_staticNoRef(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCheckCallJNIMethod_general(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCheckCallJNIMethod_synchronized(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCheckCallJNIMethod_virtualNoRef(const u4* args, JValue* pResult,
+ const Method* method, Thread* self);
+void dvmCheckCallJNIMethod_staticNoRef(const u4* args, JValue* pResult,
const Method* method, Thread* self);
/*
+ * Configure "method" to use the JNI bridge to call "func".
+ */
+void dvmUseJNIBridge(Method* method, void* func);
+
+
+/*
* Enable the "checked" versions.
*/
void dvmUseCheckedJniEnv(JNIEnvExt* pEnv);
@@ -129,10 +156,22 @@ void dvmUseCheckedJniVm(JavaVMExt* pVm);
void dvmLateEnableCheckedJni(void);
/*
+ * Decode a local, global, or weak-global reference.
+ */
+#ifdef USE_INDIRECT_REF
+Object* dvmDecodeIndirectRef(JNIEnv* env, jobject jobj);
+#else
+/* use an inline to ensure this is a no-op */
+INLINE Object* dvmDecodeIndirectRef(JNIEnv* env, jobject jobj) {
+ return (Object*) jobj;
+}
+#endif
+
+/*
* Verify that a reference passed in from native code is valid. Returns
* an indication of local/global/invalid.
*/
-jobjectRefType dvmGetJNIRefType(Object* obj);
+jobjectRefType dvmGetJNIRefType(JNIEnv* env, jobject jobj);
/*
* Get the last method called on the interp stack. This is the method