CheckJni.c revision 702e2486cdabe6df3ec64e752db2958537a11b35
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Support for -Xcheck:jni (the "careful" version of the JNI interfaces). 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want to verify types, make sure class and field IDs are valid, and 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ensure that JNI's semantic expectations are being met. JNI seems to 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be relatively lax when it comes to requirements for permission checks, 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * e.g. access to private methods is generally allowed from anywhere. 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: keep a counter on global Get/Release. Report a warning if some Gets 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * were not Released. Do not count explicit Add/DeleteGlobalRef calls (or 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * count them separately, so we can complain if they exceed a certain 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * threshold). 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: verify that the methodID passed into the Call functions is for 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a method in the specified class. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "JniInternal.h" 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <zlib.h> 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_ENTER() dvmChangeStatus(NULL, THREAD_RUNNING) 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_EXIT() dvmChangeStatus(NULL, THREAD_NATIVE) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define BASE_ENV(_env) (((JNIEnvExt*)_env)->baseFuncTable) 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define BASE_VM(_vm) (((JavaVMExt*)_vm)->baseFuncTable) 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Flags passed into checkThread(). 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_Default 0x0000 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritBad 0x0000 /* calling while in critical is bad */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritOkay 0x0001 /* ...okay */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritGet 0x0002 /* this is a critical "get" */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritRelease 0x0003 /* this is a critical "release" */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritMask 0x0003 /* bit mask to get "crit" value */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_ExcepBad 0x0000 /* raised exceptions are bad */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_ExcepOkay 0x0004 /* ...okay */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enter/exit macros for JNI env "check" functions. These do not change 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the thread state within the VM. 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_ENTER(_env, _flags) \ 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_TRACE(true, true); \ 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkThread(_env, _flags, __FUNCTION__); \ 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_EXIT(_env) \ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(false, true); } while(false) 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enter/exit macros for JNI invocation interface "check" functions. These 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do not change the thread state within the VM. 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set "_hasmeth" to true if we have a valid thread with a method pointer. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We won't have one before attaching a thread, after detaching a thread, or 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * after destroying the VM. 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_VMENTER(_vm, _hasmeth) \ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(true, _hasmeth); } while(false) 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_VMEXIT(_vm, _hasmeth) \ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(false, _hasmeth); } while(false) 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_FIELD_TYPE(_obj, _fieldid, _prim, _isstatic) \ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkFieldType(_obj, _fieldid, _prim, _isstatic, __FUNCTION__) 871cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden#define CHECK_INST_FIELD_ID(_env, _obj, _fieldid) \ 881cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden checkInstanceFieldID(_env, _obj, _fieldid, __FUNCTION__) 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_CLASS(_env, _clazz) \ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkClass(_env, _clazz, __FUNCTION__) 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_STRING(_env, _str) \ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkString(_env, _str, __FUNCTION__) 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_UTF_STRING(_env, _str, _nullok) \ 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkUtfString(_env, _str, _nullok, __FUNCTION__) 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_CLASS_NAME(_env, _str) \ 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkClassName(_env, _str, __FUNCTION__) 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_OBJECT(_env, _obj) \ 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkObject(_env, _obj, __FUNCTION__) 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_ARRAY(_env, _array) \ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkArray(_env, _array, __FUNCTION__) 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_RELEASE_MODE(_env, _mode) \ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkReleaseMode(_env, _mode, __FUNCTION__) 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_LENGTH_POSITIVE(_env, _length) \ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkLengthPositive(_env, _length, __FUNCTION__) 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_NON_NULL(_env, _ptr) \ 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkNonNull(_env, _ptr, __FUNCTION__) 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_SIG(_env, _methid, _sigbyte, _isstatic) \ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkSig(_env, _methid, _sigbyte, _isstatic, __FUNCTION__) 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print trace message when both "checkJNI" and "verbose:jni" are enabled. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_TRACE(_entry, _hasmeth) \ 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (gDvm.verboseJni && (_entry)) { \ 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* classDescriptor = "???"; \ 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* methodName = "???"; \ 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (_hasmeth) { \ 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const Method* meth = dvmGetCurrentJNIMethod(); \ 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classDescriptor = meth->clazz->descriptor; \ 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodName = meth->name; \ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* use +6 to drop the leading "Check_" */ \ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGI("JNI: %s (from %s.%s)", \ 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (__FUNCTION__)+6, classDescriptor, methodName); \ 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Log the current location. 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "func" looks like "Check_DeleteLocalRef"; we drop the "Check_". 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void showLocation(const Method* meth, const char* func) 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* desc = dexProtoCopyMethodDescriptor(&meth->prototype); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" in %s.%s %s (%s)\n", 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth->clazz->descriptor, meth->name, desc, func + 6); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Abort if we are configured to bail out on JNI warnings. 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic inline void abortMaybe() 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JavaVMExt* vm = (JavaVMExt*) gDvm.vmList; 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (vm->warnError) { 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmDumpThread(dvmThreadSelf(), false); 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the current thread is (a) attached and (b) associated with 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this particular instance of JNIEnv. 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that, if this thread previously made a critical "get" call, we 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do the corresponding "release" call before we try anything else. 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that, if an exception has been raised, the native code doesn't 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * make any JNI calls other than the Exception* methods. 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO? if we add support for non-JNI native calls, make sure that the 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method at the top of the interpreted stack is a JNI method call. (Or 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * set a flag in the Thread/JNIEnv when the call is made and clear it on 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return?) 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: we are still in THREAD_NATIVE mode. A GC could happen at any time. 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkThread(JNIEnv* env, int flags, const char* func) 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNIEnvExt* threadEnv; 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printException = false; 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get the *correct* JNIEnv by going through our TLS pointer */ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv = dvmGetJNIEnvForThread(); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the JNIEnv we've been handed matches what we expected 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to receive. 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv == NULL) { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI ERROR: non-VM thread making JNI calls\n"); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // don't set printWarn 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if ((JNIEnvExt*) env != threadEnv) { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmThreadSelf()->threadId != threadEnv->envThreadId) { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: threadEnv != thread->env?\n"); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d using env from threadid=%d\n", 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId, ((JNIEnvExt*)env)->envThreadId); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* this is a bad idea -- need to throw as we exit, or abort func */ 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //dvmThrowException("Ljava/lang/RuntimeException;", 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // "invalid use of JNI env ptr"); 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (((JNIEnvExt*) env)->self != dvmThreadSelf()) { 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* correct JNIEnv*; make sure the "self" pointer is correct */ 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: env->self != thread-self\n"); 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check for critical resource misuse. 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (flags & kFlag_CritMask) { 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritOkay: // okay to call this method 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritBad: // not okay to call 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv->critical) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d using JNI after critical get\n", 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritGet: // this is a "get" call 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* don't check here; we allow nested gets */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->critical++; 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritRelease: // this is a "release" call 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->critical--; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv->critical < 0) { 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d called too many crit releases\n", 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(false); 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check for raised exceptions. 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((flags & kFlag_ExcepOkay) == 0 && dvmCheckException(dvmThreadSelf())) { 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: JNI method called with exception raised\n"); 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printException = true; 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (false) { 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Thread* self = dvmThreadSelf(); 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("NOW: %d\n", 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (int) dvmReferenceTableEntries(&self->internalLocalRefTable)); 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printException) { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("Pending exception is:\n"); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLogExceptionStackTrace(); 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the field is of the appropriate type. If the field has an 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object type, "obj" is the object we're trying to assign into it. 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Works for both static and instance fields. 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkFieldType(jobject obj, jfieldID fieldID, PrimitiveType prim, 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isStatic, const char* func) 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* primNameList[] = { 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "Object/Array", "boolean", "char", "float", "double", 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "byte", "short", "int", "long", "void" 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char** primNames = &primNameList[1]; // shift up for PRIM_NOT 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field = (Field*) fieldID; 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldID == NULL) { 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI ERROR: null field ID\n"); 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (field->signature[0] == 'L' || field->signature[0] == '[') { 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj != NULL) { 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldClass = 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmFindLoadedClass(field->signature); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* objClass = ((Object*)obj)->clazz; 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldClass != NULL); 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(objClass != NULL); 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmInstanceof(objClass, fieldClass)) { 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n", 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name, field->signature, objClass->descriptor); 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (field->signature[0] != PRIM_TYPE_TO_LETTER[prim]) { 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n", 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name, field->signature, primNames[prim]); 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (isStatic && !dvmIsStaticField(field)) { 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isStatic) 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: accessing non-static field %s as static\n", 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name); 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: accessing static field %s as non-static\n", 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name); 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "obj" is a valid object, and that it's an object that JNI 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is allowed to know about. We allow NULL references. 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 322702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden * Switches to "running" mode before performing checks. 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkObject(JNIEnv* env, jobject obj, const char* func) 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNUSED_PARAMETER(env); 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == NULL) 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 331702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 332702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_ENTER(); 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsValidObject(obj)) { 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: native code passing in bad object %p (%s)\n", 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj, func); 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (dvmGetJNIRefType(obj) == JNIInvalidRefType) { 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: ref %p should not be visible to native code\n", obj); 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 346702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 347702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "clazz" actually points to a class object. (Also performs 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checkObject.) 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We probably don't need to identify where we're being called from, 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * because the VM is most likely about to crash and leave a core dump 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if something is wrong. 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because we're looking at an object on the GC heap, we have to switch 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to "running" mode before doing the checks. 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkClass(JNIEnv* env, jclass jclazz, const char* func) 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) jclazz; 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (clazz == NULL) { 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null jclass\n"); 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (!dvmIsValidObject((Object*) clazz)) { 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jclass points to invalid object %p\n", clazz); 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (clazz->obj.clazz != gDvm.classJavaLangClass) { 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jclass does not point to class object (%p - %s)\n", 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclazz, clazz->descriptor); 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 379702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 383702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 384702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden checkObject(env, jclazz, func); 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "str" is non-NULL and points to a String object. 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Since we're dealing with objects, switch to "running" mode. 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkString(JNIEnv* env, jstring str, const char* func) 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) str; 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == NULL) { 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null jstring (%s)\n", func); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj->clazz != gDvm.classJavaLangString) { 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsValidObject(obj)) 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jstring points to non-string object (%s)\n", 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project func); 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jstring %p is bogus (%s)\n", str, func); 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 410702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 414702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 415702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden checkObject(env, str, func); 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "bytes" points to valid "modified UTF-8" data. 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkUtfString(JNIEnv* env, const char* bytes, bool nullOk, 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* func) 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* origBytes = bytes; 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (bytes == NULL) { 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!nullOk) { 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: unexpectedly null UTF string\n"); 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (*bytes != '\0') { 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 utf8 = *(bytes++); 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Switch on the high four bits. 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (utf8 >> 4) { 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x00: 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x01: 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x02: 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x03: 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x04: 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x05: 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x06: 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x07: { 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 0xxx. No need for any extra bytes. 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x08: 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x09: 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0a: 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0b: 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0f: { 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Bit pattern 10xx or 1111, which are illegal start bytes. 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: 1111 is valid for normal UTF-8, but not the 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * modified UTF-8 used here. 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal start byte 0x%x\n", utf8); 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0e: { 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 1110, so there are two additional bytes. 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf8 = *(bytes++); 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((utf8 & 0xc0) != 0x80) { 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8); 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Fall through to take care of the final byte. 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0c: 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0d: { 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 110x, so there is one additional byte. 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf8 = *(bytes++); 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((utf8 & 0xc0) != 0x80) { 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8); 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfail: 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" string: '%s'\n", origBytes); 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some circumstances the VM will screen class names, but it doesn't 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for class lookup. When things get bounced through a class loader, they 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * can actually get normalized a couple of times; as a result, passing in 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a class name like "java.lang.Thread" instead of "java/lang/Thread" will 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * work in some circumstances. 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is incorrect and could cause strange behavior or compatibility 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * problems, so we want to screen that out here. 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We expect "full-qualified" class names, like "java/lang/Thread" or 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "[Ljava/lang/Object;". 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkClassName(JNIEnv* env, const char* className, const char* func) 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* cp; 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* quick check for illegal chars */ 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cp = className; 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (*cp != '\0') { 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (*cp == '.') 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cp++; 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // TODO: need a more rigorous check here 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfail: 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal class name '%s' (%s)\n", className, func); 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "array" is non-NULL and points to an Array object. 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Since we're dealing with objects, switch to "running" mode. 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkArray(JNIEnv* env, jarray array, const char* func) 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) array; 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == NULL) { 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null array (%s)\n", func); 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj->clazz->descriptor[0] != '[') { 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsValidObject(obj)) 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jarray points to non-array object\n"); 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jarray is bogus (%p)\n", array); 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 550702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 551702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 554702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 555702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden checkObject(env, array, func); 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the "mode" argument passed to a primitive array Release 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * function is one of the valid values. 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkReleaseMode(JNIEnv* env, jint mode, const char* func) 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mode != 0 && mode != JNI_COMMIT && mode != JNI_ABORT) { 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: bad value for mode (%d) (%s)\n", mode, func); 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the length argument to array-creation calls is >= 0. 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkLengthPositive(JNIEnv* env, jsize length, const char* func) 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (length < 0) { 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: negative length for array allocation (%s)\n", func); 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the pointer value is non-NULL. 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkNonNull(JNIEnv* env, const void* ptr, const char* func) 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ptr == NULL) { 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: invalid null pointer (%s)\n", func); 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the method's return type matches the type of call. 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "expectedSigByte" will be 'L' for all objects, including arrays. 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkSig(JNIEnv* env, jmethodID methodID, char expectedSigByte, 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isStatic, const char* func) 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const Method* meth = (const Method*) methodID; 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (expectedSigByte != meth->shorty[0]) { 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: expected return type '%c'\n", expectedSigByte); 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (isStatic && !dvmIsStaticMethod(meth)) { 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isStatic) 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: calling non-static method with static call\n"); 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: calling static method with non-static call\n"); 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* desc = dexProtoCopyMethodDescriptor(&meth->prototype); 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" calling %s.%s %s\n", 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth->clazz->descriptor, meth->name, desc); 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that this static field ID is valid for this class. 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkStaticFieldID(JNIEnv* env, jclass clazz, jfieldID fieldID) 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StaticField* base = ((ClassObject*) clazz)->sfields; 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int fieldCount = ((ClassObject*) clazz)->sfieldCount; 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((StaticField*) fieldID < base || 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (StaticField*) fieldID >= base + fieldCount) 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: static fieldID %p not valid for class %s\n", 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldID, ((ClassObject*) clazz)->descriptor); 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" base=%p count=%d\n", base, fieldCount); 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that this instance field ID is valid for this object. 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6451cf3b27e857824af08bab76489b6e25a213edc8dAndy McFaddenstatic void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID, 6461cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden const char* func) 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 648702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_ENTER(); 649702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 6501cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden if (obj == NULL) { 6511cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden LOGW("JNI WARNING: invalid null object (%s)\n", func); 6521cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden abortMaybe(); 653702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden goto bail; 6541cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden } 6551cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = ((Object*)obj)->clazz; 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check this class and all of its superclasses for a matching field. 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Don't need to scan interfaces. 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (clazz != NULL) { 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((InstField*) fieldID >= clazz->ifields && 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (InstField*) fieldID < clazz->ifields + clazz->ifieldCount) 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 666702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden goto bail; 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz = clazz->super; 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: inst fieldID %p not valid for class %s\n", 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldID, ((Object*)obj)->clazz->descriptor); 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 675702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 676702e2486cdabe6df3ec64e752db2958537a11b35Andy McFaddenbail: 677702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Guarded arrays 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardLen 512 /* must be multiple of 2 */ 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardPattern 0xd5e3 /* uncommon values; d5e3d5e3 invalid addr */ 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardMagic 0xffd5aa96 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardExtra sizeof(GuardExtra) 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this gets tucked in at the start of the buffer; struct size must be even */ 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct GuardExtra { 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 magic; 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler; 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t originalLen; 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const void* originalPtr; 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} GuardExtra; 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* find the GuardExtra given the pointer into the "live" data */ 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinline static GuardExtra* getGuardExtra(const void* dataBuf) 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* fullBuf = ((u1*) dataBuf) - kGuardLen / 2; 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (GuardExtra*) fullBuf; 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create an oversized buffer to hold the contents of "buf". Copy it in, 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * filling in the area around it with guard data. 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We use a 16-bit pattern to make a rogue memset less likely to elude us. 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* createGuardedCopy(const void* buf, size_t len, bool modOkay) 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GuardExtra* pExtra; 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t newLen = (len + kGuardLen +1) & ~0x01; 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* newBuf; 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2* pat; 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i; 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newBuf = (u1*)malloc(newLen); 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newBuf == NULL) { 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("createGuardedCopy failed on alloc of %d bytes\n", newLen); 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fill it in with a pattern */ 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) newBuf; 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = 0; i < (int)newLen / 2; i++) 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *pat++ = kGuardPattern; 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* copy the data in; note "len" could be zero */ 733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memcpy(newBuf + kGuardLen / 2, buf, len); 734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if modification is not expected, grab a checksum */ 736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler = 0; 737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!modOkay) { 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(0L, Z_NULL, 0); 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(adler, buf, len); 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *(uLong*)newBuf = adler; 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra = (GuardExtra*) newBuf; 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->magic = kGuardMagic; 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->adler = adler; 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->originalPtr = buf; 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->originalLen = len; 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return newBuf + kGuardLen / 2; 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify the guard area and, if "modOkay" is false, that the data itself 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has not been altered. 75544a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * 75644a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * The caller has already checked that "dataBuf" is non-NULL. 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic bool checkGuardedCopy(const void* dataBuf, bool modOkay) 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 76044a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden static const u4 kMagicCmp = kGuardMagic; 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* fullBuf = ((const u1*) dataBuf) - kGuardLen / 2; 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 76344a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden size_t len; 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u2* pat; 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i; 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76744a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden /* 76844a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * Before we do anything with "pExtra", check the magic number. We 76944a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * do the check with memcmp rather than "==" in case the pointer is 77044a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * unaligned. If it points to completely bogus memory we're going 77144a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * to crash, but there's no easy way around that. 77244a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden */ 77344a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden if (memcmp(&pExtra->magic, &kMagicCmp, 4) != 0) { 77444a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden u1 buf[4]; 77544a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden memcpy(buf, &pExtra->magic, 4); 77644a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden LOGE("JNI: guard magic does not match (found 0x%02x%02x%02x%02x) " 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "-- incorrect data pointer %p?\n", 77844a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden buf[3], buf[2], buf[1], buf[0], dataBuf); /* assume little endian */ 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78244a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden len = pExtra->originalLen; 78344a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check bottom half of guard; skip over optional checksum storage */ 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) fullBuf; 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = kGuardExtra / 2; i < (int) (kGuardLen / 2 - kGuardExtra) / 2; i++) 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pat[i] != kGuardPattern) { 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern(1) disturbed at %p + %d\n", 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, i*2); 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int offset = kGuardLen / 2 + len; 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (offset & 0x01) { 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* odd byte; expected value depends on endian-ness of host */ 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u2 patSample = kGuardPattern; 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fullBuf[offset] != ((const u1*) &patSample)[1]) { 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern disturbed in odd byte after %p " 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "(+%d) 0x%02x 0x%02x\n", 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, offset, fullBuf[offset], ((const u1*) &patSample)[1]); 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project offset++; 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check top half of guard */ 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) (fullBuf + offset); 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = 0; i < kGuardLen / 4; i++) { 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pat[i] != kGuardPattern) { 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern(2) disturbed at %p + %d\n", 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, offset + i*2); 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If modification is not expected, verify checksum. Strictly speaking 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this is wrong: if we told the client that we made a copy, there's no 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reason they can't alter the buffer. 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!modOkay) { 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler = adler32(0L, Z_NULL, 0); 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(adler, dataBuf, len); 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pExtra->adler != adler) { 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: buffer modified (0x%08lx vs 0x%08lx) at addr %p\n", 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->adler, adler, dataBuf); 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free up the guard buffer, scrub it, and return the original pointer. 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* freeGuardedCopy(void* dataBuf) 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* fullBuf = ((u1*) dataBuf) - kGuardLen / 2; 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* originalPtr = (void*) pExtra->originalPtr; 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t len = pExtra->originalLen; 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memset(dataBuf, len, 0xdd); 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(fullBuf); 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return originalPtr; 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Just pull out the original pointer. 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* getGuardedCopyOriginalPtr(const void* dataBuf) 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (void*) pExtra->originalPtr; 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Grab the data length. 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic size_t getGuardedCopyOriginalLen(const void* dataBuf) 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pExtra->originalLen; 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the width, in bytes, of a primitive type. 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic int dvmPrimitiveTypeWidth(PrimitiveType primType) 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const int lengths[PRIM_MAX] = { 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1, // boolean 876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2, // char 877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4, // float 878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8, // double 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1, // byte 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2, // short 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4, // int 882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8, // long 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project -1, // void 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(primType >= 0 && primType < PRIM_MAX); 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return lengths[primType]; 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a guarded copy of a primitive array. Modifications to the copied 891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data are allowed. Returns a pointer to the copied data. 892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* createGuardedPACopy(const ArrayObject* array, jboolean* isCopy) 894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PrimitiveType primType = array->obj.clazz->elementClass->primitiveType; 896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = array->length * dvmPrimitiveTypeWidth(primType); 897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* result; 898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = createGuardedCopy(array->contents, len, true); 900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Perform the array "release" operation, which may or may not copy data 909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * back into the VM, and may or may not release the underlying storage. 910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* releaseGuardedPACopy(ArrayObject* array, void* dataBuf, int mode) 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PrimitiveType primType = array->obj.clazz->elementClass->primitiveType; 914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //int len = array->length * dvmPrimitiveTypeWidth(primType); 915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool release, copyBack; 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* result; 917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(dataBuf, true)) { 919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in releaseGuardedPACopy\n"); 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 9211cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return NULL; 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (mode) { 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0: 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = copyBack = true; 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case JNI_ABORT: 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = true; 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project copyBack = false; 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case JNI_COMMIT: 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = false; 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project copyBack = true; 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: bad release mode %d\n", mode); 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (copyBack) { 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t len = getGuardedCopyOriginalLen(dataBuf); 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memcpy(array->contents, dataBuf, len); 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (release) { 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (u1*) freeGuardedCopy(dataBuf); 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (u1*) getGuardedCopyOriginalPtr(dataBuf); 951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer is to the array contents; back up to the array object */ 954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result -= offsetof(ArrayObject, contents); 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI functions 963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetVersion(JNIEnv* env) 967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetVersion(env); 971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_DefineClass(JNIEnv* env, const char* name, jobject loader, 976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jbyte* buf, jsize bufLen) 977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, loader); 980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS_NAME(env, name); 982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->DefineClass(env, name, loader, buf, bufLen); 984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_FindClass(JNIEnv* env, const char* name) 989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS_NAME(env, name); 993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FindClass(env, name); 995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_GetSuperclass(JNIEnv* env, jclass clazz) 1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetSuperclass(env, clazz); 1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsAssignableFrom(JNIEnv* env, jclass clazz1, 1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz2) 1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz1); 1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz2); 1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsAssignableFrom(env, clazz1, clazz2); 1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_FromReflectedMethod(JNIEnv* env, jobject method) 1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, method); 1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FromReflectedMethod(env, method); 1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_FromReflectedField(JNIEnv* env, jobject field) 1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, field); 1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FromReflectedField(env, field); 1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_ToReflectedMethod(JNIEnv* env, jclass cls, 1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, jboolean isStatic) 1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, cls); 1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ToReflectedMethod(env, cls, methodID, isStatic); 1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, 1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean isStatic) 1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, cls); 1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ToReflectedField(env, cls, fieldID, isStatic); 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_Throw(JNIEnv* env, jthrowable obj) 1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Throw(env, obj); 1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_ThrowNew(JNIEnv* env, jclass clazz, const char* message) 1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, message, true); 1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ThrowNew(env, clazz, message); 1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jthrowable Check_ExceptionOccurred(JNIEnv* env) 1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jthrowable result; 1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ExceptionOccurred(env); 1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ExceptionDescribe(JNIEnv* env) 1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ExceptionDescribe(env); 1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ExceptionClear(JNIEnv* env) 1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ExceptionClear(env); 1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_FatalError(JNIEnv* env, const char* msg) 1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, msg, true); 1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->FatalError(env, msg); 1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_PushLocalFrame(JNIEnv* env, jint capacity) 1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->PushLocalFrame(env, capacity); 1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_PopLocalFrame(JNIEnv* env, jobject res) 1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, res); 1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->PopLocalFrame(env, res); 1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewGlobalRef(JNIEnv* env, jobject obj) 1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewGlobalRef(env, obj); 1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_DeleteGlobalRef(JNIEnv* env, jobject localRef) 1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, localRef); 1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteGlobalRef(env, localRef); 1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewLocalRef(JNIEnv* env, jobject ref) 1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref); 1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewLocalRef(env, ref); 1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_DeleteLocalRef(JNIEnv* env, jobject globalRef) 1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, globalRef); 1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteLocalRef(env, globalRef); 1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_EnsureLocalCapacity(JNIEnv *env, jint capacity) 1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->EnsureLocalCapacity(env, capacity); 1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsSameObject(JNIEnv* env, jobject ref1, jobject ref2) 1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref1); 1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref2); 1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsSameObject(env, ref1, ref2); 1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_AllocObject(JNIEnv* env, jclass clazz) 1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->AllocObject(env, clazz); 1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, 1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ...) 1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; 1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); 1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectV(env, clazz, methodID, args); 1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); 1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, 1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args) 1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectV(env, clazz, methodID, args); 1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, 1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jvalue* args) 1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectA(env, clazz, methodID, args); 1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_GetObjectClass(JNIEnv* env, jobject obj) 1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectClass(env, obj); 1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz) 1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsInstanceOf(env, obj, clazz); 1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_GetMethodID(JNIEnv* env, jclass clazz, const char* name, 1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* sig) 1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetMethodID(env, clazz, name, sig); 1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_GetFieldID(JNIEnv* env, jclass clazz, 1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetFieldID(env, clazz, name, sig); 1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_GetStaticMethodID(JNIEnv* env, jclass clazz, 1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStaticMethodID(env, clazz, name, sig); 1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_GetStaticFieldID(JNIEnv* env, jclass clazz, 1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStaticFieldID(env, clazz, name, sig); 1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_STATIC_TYPE_FIELD(_ctype, _jname, _isref) \ 1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_GetStatic##_jname##Field(JNIEnv* env, jclass clazz, \ 1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID) \ 1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype result; \ 1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkStaticFieldID(env, clazz, fieldID); \ 1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStatic##_jname##Field(env, clazz, \ 1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldID); \ 1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jobject, Object, true); 1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jboolean, Boolean, false); 1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jbyte, Byte, false); 1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jchar, Char, false); 1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jshort, Short, false); 1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jint, Int, false); 1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jlong, Long, false); 1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jfloat, Float, false); 1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_STATIC_TYPE_FIELD(jdouble, Double, false); 1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_STATIC_TYPE_FIELD(_ctype, _jname, _ftype) \ 1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_SetStatic##_jname##Field(JNIEnv* env, jclass clazz, \ 1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID, _ctype value) \ 1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkStaticFieldID(env, clazz, fieldID); \ 1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_FIELD_TYPE((jobject)(u4)value, fieldID, _ftype, true); \ 1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->SetStatic##_jname##Field(env, clazz, fieldID, \ 1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value); \ 1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jobject, Object, PRIM_NOT); 1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jboolean, Boolean, PRIM_BOOLEAN); 1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jbyte, Byte, PRIM_BYTE); 1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jchar, Char, PRIM_CHAR); 1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jshort, Short, PRIM_SHORT); 1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jint, Int, PRIM_INT); 1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jlong, Long, PRIM_LONG); 1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jfloat, Float, PRIM_FLOAT); 1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jdouble, Double, PRIM_DOUBLE); 1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_TYPE_FIELD(_ctype, _jname, _isref) \ 1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Get##_jname##Field(JNIEnv* env, jobject obj, \ 1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID) \ 1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype result; \ 13611cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden CHECK_INST_FIELD_ID(env, obj, fieldID); \ 1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Get##_jname##Field(env, obj, fieldID); \ 1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jobject, Object, true); 1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jboolean, Boolean, false); 1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jbyte, Byte, false); 1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jchar, Char, false); 1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jshort, Short, false); 1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jint, Int, false); 1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jlong, Long, false); 1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jfloat, Float, false); 1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectGET_TYPE_FIELD(jdouble, Double, false); 1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_TYPE_FIELD(_ctype, _jname, _ftype) \ 1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Set##_jname##Field(JNIEnv* env, jobject obj, \ 1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID, _ctype value) \ 1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 13821cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden CHECK_INST_FIELD_ID(env, obj, fieldID); \ 1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_FIELD_TYPE((jobject)(u4) value, fieldID, _ftype, false); \ 1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Set##_jname##Field(env, obj, fieldID, value); \ 1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jobject, Object, PRIM_NOT); 1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jboolean, Boolean, PRIM_BOOLEAN); 1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jbyte, Byte, PRIM_BYTE); 1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jchar, Char, PRIM_CHAR); 1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jshort, Short, PRIM_SHORT); 1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jint, Int, PRIM_INT); 1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jlong, Long, PRIM_LONG); 1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jfloat, Float, PRIM_FLOAT); 1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jdouble, Double, PRIM_DOUBLE); 1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CALL_VIRTUAL(_ctype, _jname, _retfail, _retdecl, _retasgn, _retok, \ 1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retsig) \ 1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##Method(JNIEnv* env, jobject obj, \ 1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, ...) \ 1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodV(env, obj, methodID, \ 1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##MethodV(JNIEnv* env, jobject obj, \ 1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, va_list args) \ 1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodV(env, obj, methodID, \ 1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##MethodA(JNIEnv* env, jobject obj, \ 1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, jvalue* args) \ 1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodA(env, obj, methodID, \ 1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jobject, Object, NULL, Object* result, result=, result, 'L'); 1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jboolean, Boolean, 0, jboolean result, result=, result, 'Z'); 1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jbyte, Byte, 0, jbyte result, result=, result, 'B'); 1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jchar, Char, 0, jchar result, result=, result, 'C'); 1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jshort, Short, 0, jshort result, result=, result, 'S'); 1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jint, Int, 0, jint result, result=, result, 'I'); 1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jlong, Long, 0, jlong result, result=, result, 'J'); 1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jfloat, Float, 0.0f, jfloat result, result=, *(float*)&result, 'F'); 1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(jdouble, Double, 0.0, jdouble result, result=, *(double*)&result, 'D'); 1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_VIRTUAL(void, Void, , , , , 'V'); 1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CALL_NONVIRTUAL(_ctype, _jname, _retfail, _retdecl, _retasgn, \ 1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retok, _retsig) \ 1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##Method(JNIEnv* env, \ 1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, ...) \ 1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodV(env, obj, \ 1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##MethodV(JNIEnv* env, \ 1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, va_list args) \ 1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodV(env, obj, \ 1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##MethodA(JNIEnv* env, \ 1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, jvalue* args) \ 1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodA(env, obj, \ 1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jobject, Object, NULL, Object* result, result=, (Object*)(u4)result, 'L'); 1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jboolean, Boolean, 0, jboolean result, result=, result, 'Z'); 1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jbyte, Byte, 0, jbyte result, result=, result, 'B'); 1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jchar, Char, 0, jchar result, result=, result, 'C'); 1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jshort, Short, 0, jshort result, result=, result, 'S'); 1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jint, Int, 0, jint result, result=, result, 'I'); 1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jlong, Long, 0, jlong result, result=, result, 'J'); 1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jfloat, Float, 0.0f, jfloat result, result=, *(float*)&result, 'F'); 1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(jdouble, Double, 0.0, jdouble result, result=, *(double*)&result, 'D'); 1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_NONVIRTUAL(void, Void, , , , , 'V'); 1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CALL_STATIC(_ctype, _jname, _retfail, _retdecl, _retasgn, _retok, \ 1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retsig) \ 1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##Method(JNIEnv* env, \ 1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, ...) \ 1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodV(env, clazz, \ 1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##MethodV(JNIEnv* env, \ 1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, va_list args) \ 1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodV(env, clazz, \ 1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##MethodA(JNIEnv* env, \ 1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, jvalue* args) \ 1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodA(env, clazz, \ 1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jobject, Object, NULL, Object* result, result=, (Object*)(u4)result, 'L'); 1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jboolean, Boolean, 0, jboolean result, result=, result, 'Z'); 1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jbyte, Byte, 0, jbyte result, result=, result, 'B'); 1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jchar, Char, 0, jchar result, result=, result, 'C'); 1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jshort, Short, 0, jshort result, result=, result, 'S'); 1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jint, Int, 0, jint result, result=, result, 'I'); 1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jlong, Long, 0, jlong result, result=, result, 'J'); 1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jfloat, Float, 0.0f, jfloat result, result=, *(float*)&result, 'F'); 1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(jdouble, Double, 0.0, jdouble result, result=, *(double*)&result, 'D'); 1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCALL_STATIC(void, Void, , , , , 'V'); 1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jstring Check_NewString(JNIEnv* env, const jchar* unicodeChars, 1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len) 1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jstring result; 1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewString(env, unicodeChars, len); 1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetStringLength(JNIEnv* env, jstring string) 1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringLength(env, string); 1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const jchar* Check_GetStringChars(JNIEnv* env, jstring string, 1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* result; 1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringChars(env, string, isCopy); 1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringLen(string) * 2; 1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const jchar*) createGuardedCopy(result, len, false); 1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringChars(JNIEnv* env, jstring string, 1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* chars) 1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, chars); 1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(chars, false)) { 1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringChars\n"); 1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 16041cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project chars = (const jchar*) freeGuardedCopy((jchar*)chars); 1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringChars(env, string, chars); 1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jstring Check_NewStringUTF(JNIEnv* env, const char* bytes) 1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, bytes, true); 1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jstring result; 1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewStringUTF(env, bytes); 1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetStringUTFLength(JNIEnv* env, jstring string) 1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringUTFLength(env, string); 1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const char* Check_GetStringUTFChars(JNIEnv* env, jstring string, 1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* result; 1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringUTFChars(env, string, isCopy); 1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringUtf8ByteLen(string) + 1; 1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const char*) createGuardedCopy(result, len, false); 1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringUTFChars(JNIEnv* env, jstring string, 1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* utf) 1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, utf); 1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //int len = dvmStringUtf8ByteLen(string) + 1; 1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(utf, false)) { 1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars\n"); 1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 16601cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf = (const char*) freeGuardedCopy((char*)utf); 1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringUTFChars(env, string, utf); 1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetArrayLength(JNIEnv* env, jarray array) 1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetArrayLength(env, array); 1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobjectArray Check_NewObjectArray(JNIEnv* env, jsize length, 1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass elementClass, jobject initialElement) 1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, elementClass); 1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, initialElement); 1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_LENGTH_POSITIVE(env, length); 1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobjectArray result; 1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectArray(env, length, elementClass, 1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project initialElement); 1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_GetObjectArrayElement(JNIEnv* env, jobjectArray array, 1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize index) 1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectArrayElement(env, array, index); 1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_SetObjectArrayElement(JNIEnv* env, jobjectArray array, 1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize index, jobject value) 1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->SetObjectArrayElement(env, array, index, value); 1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define NEW_PRIMITIVE_ARRAY(_artype, _jname) \ 1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _artype Check_New##_jname##Array(JNIEnv* env, jsize length) \ 1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_LENGTH_POSITIVE(env, length); \ 1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _artype result; \ 1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->New##_jname##Array(env, length); \ 1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jbooleanArray, Boolean); 1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jbyteArray, Byte); 1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jcharArray, Char); 1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jshortArray, Short); 1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jintArray, Int); 1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jlongArray, Long); 1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jfloatArray, Float); 1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jdoubleArray, Double); 1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname) \ 1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype* Check_Get##_jname##ArrayElements(JNIEnv* env, \ 1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jboolean* isCopy) \ 1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype* result; \ 1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Get##_jname##ArrayElements(env, \ 1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project array, isCopy); \ 1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { \ 1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (_ctype*) \ 1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project createGuardedPACopy((ArrayObject*) array, isCopy); \ 1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define RELEASE_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname) \ 1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Release##_jname##ArrayElements(JNIEnv* env, \ 1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, _ctype* elems, jint mode) \ 1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); \ 1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, elems); \ 1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_RELEASE_MODE(env, mode); \ 1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { \ 1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project elems = (_ctype*) releaseGuardedPACopy((ArrayObject*) array, \ 1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project elems, mode); \ 1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Release##_jname##ArrayElements(env, \ 1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project array, elems, mode); \ 1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_PRIMITIVE_ARRAY_REGION(_ctype, _jname) \ 1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Get##_jname##ArrayRegion(JNIEnv* env, \ 1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jsize start, jsize len, _ctype* buf) \ 1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Get##_jname##ArrayRegion(env, array, start, \ 1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project len, buf); \ 1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_PRIMITIVE_ARRAY_REGION(_ctype, _jname) \ 1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Set##_jname##ArrayRegion(JNIEnv* env, \ 1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jsize start, jsize len, const _ctype* buf) \ 1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Set##_jname##ArrayRegion(env, array, start, \ 1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project len, buf); \ 1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PRIMITIVE_ARRAY_FUNCTIONS(_ctype, _jname, _typechar) \ 1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \ 1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RELEASE_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \ 1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_PRIMITIVE_ARRAY_REGION(_ctype, _jname); \ 1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_PRIMITIVE_ARRAY_REGION(_ctype, _jname); 1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* TODO: verify primitive array type matches call type */ 1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jboolean, Boolean, 'Z'); 1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jbyte, Byte, 'B'); 1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jchar, Char, 'C'); 1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jshort, Short, 'S'); 1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jint, Int, 'I'); 1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jlong, Long, 'J'); 1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jfloat, Float, 'F'); 1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jdouble, Double, 'D'); 1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_RegisterNatives(JNIEnv* env, jclass clazz, 1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const JNINativeMethod* methods, jint nMethods) 1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->RegisterNatives(env, clazz, methods, nMethods); 1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_UnregisterNatives(JNIEnv* env, jclass clazz) 1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->UnregisterNatives(env, clazz); 1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_MonitorEnter(JNIEnv* env, jobject obj) 1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->MonitorEnter(env, obj); 1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_MonitorExit(JNIEnv* env, jobject obj) 1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->MonitorExit(env, obj); 1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetJavaVM(JNIEnv *env, JavaVM **vm) 1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetJavaVM(env, vm); 1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_GetStringRegion(JNIEnv* env, jstring str, jsize start, 1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len, jchar* buf) 1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, str); 1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->GetStringRegion(env, str, start, len, buf); 1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, 1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len, char* buf) 1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, str); 1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->GetStringUTFRegion(env, str, start, len, buf); 1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* Check_GetPrimitiveArrayCritical(JNIEnv* env, jarray array, 1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritGet); 1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* result; 1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetPrimitiveArrayCritical(env, array, isCopy); 1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = createGuardedPACopy((ArrayObject*) array, isCopy); 1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, 1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* carray, jint mode) 1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritRelease | kFlag_ExcepOkay); 1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, carray); 1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_RELEASE_MODE(env, mode); 1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project carray = releaseGuardedPACopy((ArrayObject*) array, carray, mode); 1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleasePrimitiveArrayCritical(env, array, carray, mode); 1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const jchar* Check_GetStringCritical(JNIEnv* env, jstring string, 1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritGet); 1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* result; 1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringCritical(env, string, isCopy); 1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringLen(string) * 2; 1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const jchar*) createGuardedCopy(result, len, false); 1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringCritical(JNIEnv* env, jstring string, 1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* carray) 1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritRelease | kFlag_ExcepOkay); 1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, carray); 1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(carray, false)) { 1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringCritical\n"); 1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 19271cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project carray = (const jchar*) freeGuardedCopy((jchar*)carray); 1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringCritical(env, string, carray); 1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jweak Check_NewWeakGlobalRef(JNIEnv* env, jobject obj) 1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jweak result; 1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewWeakGlobalRef(env, obj); 1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_DeleteWeakGlobalRef(JNIEnv* env, jweak obj) 1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteWeakGlobalRef(env, obj); 1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_ExceptionCheck(JNIEnv* env) 1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay | kFlag_ExcepOkay); 1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ExceptionCheck(env); 1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobjectRefType Check_GetObjectRefType(JNIEnv* env, jobject obj) 1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobjectRefType result; 1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectRefType(env, obj); 1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewDirectByteBuffer(JNIEnv* env, void* address, 1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jlong capacity) 1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (address == NULL || capacity < 0) { 1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)\n", 1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project address, (long) capacity); 1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 19811cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return NULL; 1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewDirectByteBuffer(env, address, capacity); 1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* Check_GetDirectBufferAddress(JNIEnv* env, jobject buf) 1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, buf); 1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* result; 1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //if (buf == NULL) 1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // result = NULL; 1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //else 1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetDirectBufferAddress(env, buf); 1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jlong Check_GetDirectBufferCapacity(JNIEnv* env, jobject buf) 2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, buf); 2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jlong result; 2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //if (buf == NULL) 2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // result = -1; 2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //else 2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetDirectBufferCapacity(env, buf); 2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI invocation functions 2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_DestroyJavaVM(JavaVM* vm) 2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->DestroyJavaVM(vm); 2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, false); 2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, 2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* thr_args) 2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->AttachCurrentThread(vm, p_env, thr_args); 2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, 2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* thr_args) 2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->AttachCurrentThreadAsDaemon(vm, p_env, thr_args); 2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_DetachCurrentThread(JavaVM* vm) 2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, true); 2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->DetachCurrentThread(vm); 2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, false); 2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetEnv(JavaVM* vm, void** env, jint version) 2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, true); 2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->GetEnv(vm, env, version); 2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Function tables 2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const struct JNINativeInterface gCheckNativeInterface = { 2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetVersion, 2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DefineClass, 2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FindClass, 2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FromReflectedMethod, 2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FromReflectedField, 2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ToReflectedMethod, 2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetSuperclass, 2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsAssignableFrom, 2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ToReflectedField, 2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_Throw, 2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ThrowNew, 2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionOccurred, 2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionDescribe, 2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionClear, 2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FatalError, 2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_PushLocalFrame, 2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_PopLocalFrame, 2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewGlobalRef, 2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteGlobalRef, 2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteLocalRef, 2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsSameObject, 2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewLocalRef, 2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_EnsureLocalCapacity, 2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AllocObject, 2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObject, 2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectV, 2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectA, 2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectClass, 2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsInstanceOf, 2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetMethodID, 2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethod, 2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethodV, 2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethodA, 2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethod, 2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethodV, 2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethodA, 2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethod, 2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethodV, 2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethodA, 2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethod, 2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethodV, 2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethodA, 2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethod, 2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethodV, 2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethodA, 2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethod, 2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethodV, 2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethodA, 2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethod, 2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethodV, 2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethodA, 2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethod, 2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethodV, 2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethodA, 2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethod, 2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethodV, 2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethodA, 2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethod, 2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethodV, 2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethodA, 2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethod, 2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethodV, 2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethodA, 2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethod, 2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethodV, 2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethodA, 2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethod, 2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethodV, 2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethodA, 2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethod, 2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethodV, 2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethodA, 2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethod, 2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethodV, 2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethodA, 2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethod, 2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethodV, 2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethodA, 2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethod, 2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethodV, 2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethodA, 2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethod, 2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethodV, 2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethodA, 2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethod, 2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethodV, 2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethodA, 2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethod, 2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethodV, 2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethodA, 2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFieldID, 2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectField, 2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanField, 2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteField, 2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharField, 2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortField, 2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntField, 2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongField, 2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatField, 2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleField, 2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetObjectField, 2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetBooleanField, 2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetByteField, 2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetCharField, 2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetShortField, 2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetIntField, 2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetLongField, 2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetFloatField, 2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetDoubleField, 2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticMethodID, 2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethod, 2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethodV, 2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethodA, 2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethod, 2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethodV, 2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethodA, 2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethod, 2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethodV, 2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethodA, 2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethod, 2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethodV, 2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethodA, 2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethod, 2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethodV, 2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethodA, 2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethod, 2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethodV, 2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethodA, 2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethod, 2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethodV, 2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethodA, 2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethod, 2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethodV, 2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethodA, 2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethod, 2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethodV, 2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethodA, 2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethod, 2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethodV, 2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethodA, 2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticFieldID, 2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticObjectField, 2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticBooleanField, 2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticByteField, 2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticCharField, 2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticShortField, 2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticIntField, 2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticLongField, 2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticFloatField, 2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticDoubleField, 2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticObjectField, 2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticBooleanField, 2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticByteField, 2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticCharField, 2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticShortField, 2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticIntField, 2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticLongField, 2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticFloatField, 2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticDoubleField, 2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewString, 2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringLength, 2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringChars, 2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringChars, 2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewStringUTF, 2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFLength, 2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFChars, 2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringUTFChars, 2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetArrayLength, 2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectArray, 2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectArrayElement, 2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetObjectArrayElement, 2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewBooleanArray, 2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewByteArray, 2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewCharArray, 2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewShortArray, 2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewIntArray, 2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewLongArray, 2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewFloatArray, 2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewDoubleArray, 2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanArrayElements, 2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteArrayElements, 2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharArrayElements, 2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortArrayElements, 2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntArrayElements, 2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongArrayElements, 2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatArrayElements, 2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleArrayElements, 2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseBooleanArrayElements, 2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseByteArrayElements, 2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseCharArrayElements, 2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseShortArrayElements, 2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseIntArrayElements, 2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseLongArrayElements, 2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseFloatArrayElements, 2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseDoubleArrayElements, 2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanArrayRegion, 2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteArrayRegion, 2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharArrayRegion, 2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortArrayRegion, 2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntArrayRegion, 2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongArrayRegion, 2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatArrayRegion, 2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleArrayRegion, 2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetBooleanArrayRegion, 2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetByteArrayRegion, 2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetCharArrayRegion, 2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetShortArrayRegion, 2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetIntArrayRegion, 2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetLongArrayRegion, 2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetFloatArrayRegion, 2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetDoubleArrayRegion, 2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_RegisterNatives, 2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_UnregisterNatives, 2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_MonitorEnter, 2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_MonitorExit, 2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetJavaVM, 2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringRegion, 2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFRegion, 2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetPrimitiveArrayCritical, 2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleasePrimitiveArrayCritical, 2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringCritical, 2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringCritical, 2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewWeakGlobalRef, 2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteWeakGlobalRef, 2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionCheck, 2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewDirectByteBuffer, 2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDirectBufferAddress, 2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDirectBufferCapacity, 2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectRefType 2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const struct JNIInvokeInterface gCheckInvokeInterface = { 2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DestroyJavaVM, 2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AttachCurrentThread, 2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DetachCurrentThread, 2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetEnv, 2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AttachCurrentThreadAsDaemon, 2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Replace the normal table with the checked table. 2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUseCheckedJniEnv(JNIEnvExt* pEnv) 2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(pEnv->funcTable != &gCheckNativeInterface); 2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pEnv->baseFuncTable = pEnv->funcTable; 2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pEnv->funcTable = &gCheckNativeInterface; 2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Replace the normal table with the checked table. 2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUseCheckedJniVm(JavaVMExt* pVm) 2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(pVm->funcTable != &gCheckInvokeInterface); 2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pVm->baseFuncTable = pVm->funcTable; 2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pVm->funcTable = &gCheckInvokeInterface; 2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2383