CheckJni.c revision ab00d455ea67fbf4090567bb09ead8017896ea61
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 3859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFaddenstatic void abortMaybe(void); // fwd 3959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 4059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 4159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden/* 4259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * =========================================================================== 4359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * JNI call bridge wrapper 4459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * =========================================================================== 4559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 4659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 4759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden/* 4859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Check the result of a native method call that returns an object reference. 4959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * 5059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * The primary goal here is to verify that native code is returning the 5159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * correct type of object. If it's declared to return a String but actually 5259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * returns a byte array, things will fail in strange ways later on. 5359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * 5459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * This can be a fairly expensive operation, since we have to look up the 5559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * return type class by name in method->clazz' class loader. We take a 5659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * shortcut here and allow the call to succeed if the descriptor strings 5759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * match. This will allow some false-positives when a class is redefined 5859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * by a class loader, but that's rare enough that it doesn't seem worth 5959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * testing for. 6059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 6159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFaddenstatic void checkCallCommon(const u4* args, JValue* pResult, 6259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden const Method* method, Thread* self) 6359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden{ 6459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden assert(pResult->l != NULL); 65ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* resultObj = dvmDecodeIndirectRef(self->jniEnv, pResult->l); 66ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ClassObject* objClazz = resultObj->clazz; 6759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 6859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden /* 6959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Make sure that pResult->l is an instance of the type this 7059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * method was expected to return. 7159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 7259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden const char* declType = dexProtoGetReturnType(&method->prototype); 7359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden const char* objType = objClazz->descriptor; 7459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden if (strcmp(declType, objType) == 0) { 7559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden /* names match; ignore class loader issues and allow it */ 7659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGV("Check %s.%s: %s io %s (FAST-OK)\n", 7759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden method->clazz->descriptor, method->name, objType, declType); 7859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } else { 7959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden /* 8059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Names didn't match. We need to resolve declType in the context 8159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * of method->clazz->classLoader, and compare the class objects 8259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * for equality. 8359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * 8459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Since we're returning an instance of declType, it's safe to 8559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * assume that it has been loaded and initialized (or, for the case 8659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * of an array, generated), so we can just look for it in the 8759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * loaded-classes list. 8859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 8959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden ClassObject* declClazz; 9059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 9159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden declClazz = dvmLookupClass(declType, method->clazz->classLoader, false); 9259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden if (declClazz == NULL) { 9359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGW("JNI WARNING: method declared to return '%s' returned '%s'\n", 9459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden declType, objType); 9559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGW(" failed in %s.%s ('%s' not found)\n", 9659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden method->clazz->descriptor, method->name, declType); 9759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden abortMaybe(); 9859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden return; 9959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } 10059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden if (!dvmInstanceof(objClazz, declClazz)) { 10159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGW("JNI WARNING: method declared to return '%s' returned '%s'\n", 10259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden declType, objType); 10359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGW(" failed in %s.%s\n", 10459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden method->clazz->descriptor, method->name); 10559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden abortMaybe(); 10659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden return; 10759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } else { 10859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden LOGV("Check %s.%s: %s io %s (SLOW-OK)\n", 10959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden method->clazz->descriptor, method->name, objType, declType); 11059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } 11159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } 11259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden} 11359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 11459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden/* 11559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Check a call into native code. 11659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 11759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFaddenvoid dvmCheckCallJNIMethod(const u4* args, JValue* pResult, 11859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden const Method* method, Thread* self) 11959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden{ 12059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden dvmCallJNIMethod(args, pResult, method, self); 12159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden if (method->shorty[0] == 'L' && !dvmCheckException(self) && 12259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden pResult->l != NULL) 12359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden { 12459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden checkCallCommon(args, pResult, method, self); 12559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } 12659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden} 12759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 12859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden/* 12959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * Check a synchronized call into native code. 13059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 13159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFaddenvoid dvmCheckCallSynchronizedJNIMethod(const u4* args, JValue* pResult, 13259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden const Method* method, Thread* self) 13359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden{ 13459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden dvmCallSynchronizedJNIMethod(args, pResult, method, self); 13559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden if (method->shorty[0] == 'L' && !dvmCheckException(self) && 13659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden pResult->l != NULL) 13759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden { 13859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden checkCallCommon(args, pResult, method, self); 13959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden } 14059b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden} 14159b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 14259b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 14359b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden/* 14459b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * =========================================================================== 14559b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * JNI function helpers 14659b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden * =========================================================================== 14759b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden */ 14859b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFadden 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_ENTER() dvmChangeStatus(NULL, THREAD_RUNNING) 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_EXIT() dvmChangeStatus(NULL, THREAD_NATIVE) 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define BASE_ENV(_env) (((JNIEnvExt*)_env)->baseFuncTable) 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define BASE_VM(_vm) (((JavaVMExt*)_vm)->baseFuncTable) 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1558e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden#define kRedundantDirectBufferTest true 1568e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Flags passed into checkThread(). 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_Default 0x0000 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritBad 0x0000 /* calling while in critical is bad */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritOkay 0x0001 /* ...okay */ 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritGet 0x0002 /* this is a critical "get" */ 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritRelease 0x0003 /* this is a critical "release" */ 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_CritMask 0x0003 /* bit mask to get "crit" value */ 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_ExcepBad 0x0000 /* raised exceptions are bad */ 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kFlag_ExcepOkay 0x0004 /* ...okay */ 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enter/exit macros for JNI env "check" functions. These do not change 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the thread state within the VM. 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_ENTER(_env, _flags) \ 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_TRACE(true, true); \ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkThread(_env, _flags, __FUNCTION__); \ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_EXIT(_env) \ 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(false, true); } while(false) 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enter/exit macros for JNI invocation interface "check" functions. These 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do not change the thread state within the VM. 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set "_hasmeth" to true if we have a valid thread with a method pointer. 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We won't have one before attaching a thread, after detaching a thread, or 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * after destroying the VM. 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_VMENTER(_vm, _hasmeth) \ 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(true, _hasmeth); } while(false) 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_VMEXIT(_vm, _hasmeth) \ 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { JNI_TRACE(false, _hasmeth); } while(false) 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden#define CHECK_FIELD_TYPE(_env, _obj, _fieldid, _prim, _isstatic) \ 199ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden checkFieldType(_env, _obj, _fieldid, _prim, _isstatic, __FUNCTION__) 2001cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden#define CHECK_INST_FIELD_ID(_env, _obj, _fieldid) \ 2011cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden checkInstanceFieldID(_env, _obj, _fieldid, __FUNCTION__) 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_CLASS(_env, _clazz) \ 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkClass(_env, _clazz, __FUNCTION__) 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_STRING(_env, _str) \ 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkString(_env, _str, __FUNCTION__) 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_UTF_STRING(_env, _str, _nullok) \ 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkUtfString(_env, _str, _nullok, __FUNCTION__) 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_CLASS_NAME(_env, _str) \ 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkClassName(_env, _str, __FUNCTION__) 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_OBJECT(_env, _obj) \ 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkObject(_env, _obj, __FUNCTION__) 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_ARRAY(_env, _array) \ 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkArray(_env, _array, __FUNCTION__) 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_RELEASE_MODE(_env, _mode) \ 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkReleaseMode(_env, _mode, __FUNCTION__) 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_LENGTH_POSITIVE(_env, _length) \ 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkLengthPositive(_env, _length, __FUNCTION__) 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_NON_NULL(_env, _ptr) \ 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkNonNull(_env, _ptr, __FUNCTION__) 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CHECK_SIG(_env, _methid, _sigbyte, _isstatic) \ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkSig(_env, _methid, _sigbyte, _isstatic, __FUNCTION__) 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print trace message when both "checkJNI" and "verbose:jni" are enabled. 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define JNI_TRACE(_entry, _hasmeth) \ 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (gDvm.verboseJni && (_entry)) { \ 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* classDescriptor = "???"; \ 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* methodName = "???"; \ 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (_hasmeth) { \ 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const Method* meth = dvmGetCurrentJNIMethod(); \ 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classDescriptor = meth->clazz->descriptor; \ 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodName = meth->name; \ 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* use +6 to drop the leading "Check_" */ \ 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGI("JNI: %s (from %s.%s)", \ 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (__FUNCTION__)+6, classDescriptor, methodName); \ 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Log the current location. 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "func" looks like "Check_DeleteLocalRef"; we drop the "Check_". 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void showLocation(const Method* meth, const char* func) 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* desc = dexProtoCopyMethodDescriptor(&meth->prototype); 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" in %s.%s %s (%s)\n", 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth->clazz->descriptor, meth->name, desc, func + 6); 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Abort if we are configured to bail out on JNI warnings. 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 25959b6177e2fa9c9f1f16d7eff57e481f5282afbdaAndy McFaddenstatic void abortMaybe(void) 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JavaVMExt* vm = (JavaVMExt*) gDvm.vmList; 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (vm->warnError) { 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmDumpThread(dvmThreadSelf(), false); 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the current thread is (a) attached and (b) associated with 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this particular instance of JNIEnv. 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that, if this thread previously made a critical "get" call, we 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do the corresponding "release" call before we try anything else. 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that, if an exception has been raised, the native code doesn't 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * make any JNI calls other than the Exception* methods. 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO? if we add support for non-JNI native calls, make sure that the 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method at the top of the interpreted stack is a JNI method call. (Or 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * set a flag in the Thread/JNIEnv when the call is made and clear it on 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return?) 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: we are still in THREAD_NATIVE mode. A GC could happen at any time. 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkThread(JNIEnv* env, int flags, const char* func) 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNIEnvExt* threadEnv; 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printException = false; 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get the *correct* JNIEnv by going through our TLS pointer */ 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv = dvmGetJNIEnvForThread(); 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the JNIEnv we've been handed matches what we expected 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to receive. 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv == NULL) { 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI ERROR: non-VM thread making JNI calls\n"); 300ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden // don't set printWarn -- it'll try to call showLocation() 301ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden dvmAbort(); 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if ((JNIEnvExt*) env != threadEnv) { 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmThreadSelf()->threadId != threadEnv->envThreadId) { 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: threadEnv != thread->env?\n"); 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d using env from threadid=%d\n", 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId, ((JNIEnvExt*)env)->envThreadId); 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* this is a bad idea -- need to throw as we exit, or abort func */ 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //dvmThrowException("Ljava/lang/RuntimeException;", 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // "invalid use of JNI env ptr"); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (((JNIEnvExt*) env)->self != dvmThreadSelf()) { 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* correct JNIEnv*; make sure the "self" pointer is correct */ 317ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGE("JNI ERROR: env->self != thread-self (%p vs. %p)\n", 318ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ((JNIEnvExt*) env)->self, dvmThreadSelf()); 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check for critical resource misuse. 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (flags & kFlag_CritMask) { 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritOkay: // okay to call this method 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritBad: // not okay to call 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv->critical) { 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d using JNI after critical get\n", 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId); 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritGet: // this is a "get" call 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* don't check here; we allow nested gets */ 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->critical++; 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case kFlag_CritRelease: // this is a "release" call 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->critical--; 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (threadEnv->critical < 0) { 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: threadid=%d called too many crit releases\n", 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project threadEnv->envThreadId); 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(false); 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check for raised exceptions. 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((flags & kFlag_ExcepOkay) == 0 && dvmCheckException(dvmThreadSelf())) { 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: JNI method called with exception raised\n"); 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printException = true; 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printException) { 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("Pending exception is:\n"); 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLogExceptionStackTrace(); 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the field is of the appropriate type. If the field has an 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object type, "obj" is the object we're trying to assign into it. 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Works for both static and instance fields. 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 376ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkFieldType(JNIEnv* env, jobject jobj, jfieldID fieldID, 377ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden PrimitiveType prim, bool isStatic, const char* func) 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const char* primNameList[] = { 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "Object/Array", "boolean", "char", "float", "double", 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "byte", "short", "int", "long", "void" 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char** primNames = &primNameList[1]; // shift up for PRIM_NOT 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field = (Field*) fieldID; 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 387ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* obj = dvmDecodeIndirectRef(env, jobj); 388ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldID == NULL) { 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI ERROR: null field ID\n"); 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (field->signature[0] == 'L' || field->signature[0] == '[') { 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj != NULL) { 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldClass = 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmFindLoadedClass(field->signature); 398ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ClassObject* objClass = obj->clazz; 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(fieldClass != NULL); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(objClass != NULL); 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmInstanceof(objClass, fieldClass)) { 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n", 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name, field->signature, objClass->descriptor); 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (field->signature[0] != PRIM_TYPE_TO_LETTER[prim]) { 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n", 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name, field->signature, primNames[prim]); 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (isStatic && !dvmIsStaticField(field)) { 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isStatic) 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: accessing non-static field %s as static\n", 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name); 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: accessing static field %s as non-static\n", 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field->name); 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 430ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden * Verify that "jobj" is a valid object, and that it's an object that JNI 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is allowed to know about. We allow NULL references. 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 433702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden * Switches to "running" mode before performing checks. 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 435ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkObject(JNIEnv* env, jobject jobj, const char* func) 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNUSED_PARAMETER(env); 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 440ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden if (jobj == NULL) 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 442702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 443ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* obj = dvmDecodeIndirectRef(env, jobj); 444ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden 445702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_ENTER(); 446ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden if (obj == NULL || !dvmIsValidObject(obj)) { 447ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: native code passing in bad object %p %p (%s)\n", 448ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden jobj, obj, func); 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 450ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden } else if (dvmGetJNIRefType(env, obj) == JNIInvalidRefType) { 451ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: %p is not a valid JNI reference\n", jobj); 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 459702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 460702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "clazz" actually points to a class object. (Also performs 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checkObject.) 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We probably don't need to identify where we're being called from, 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * because the VM is most likely about to crash and leave a core dump 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if something is wrong. 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because we're looking at an object on the GC heap, we have to switch 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to "running" mode before doing the checks. 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkClass(JNIEnv* env, jclass jclazz, const char* func) 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 479ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ClassObject* clazz = (ClassObject*) dvmDecodeIndirectRef(env, jclazz); 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (clazz == NULL) { 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null jclass\n"); 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (!dvmIsValidObject((Object*) clazz)) { 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jclass points to invalid object %p\n", clazz); 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (clazz->obj.clazz != gDvm.classJavaLangClass) { 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: jclass does not point to class object (%p - %s)\n", 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclazz, clazz->descriptor); 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 492702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 496702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 497702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden checkObject(env, jclazz, func); 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "str" is non-NULL and points to a String object. 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Since we're dealing with objects, switch to "running" mode. 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 505ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkString(JNIEnv* env, jstring jstr, const char* func) 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 510ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* obj = dvmDecodeIndirectRef(env, jstr); 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == NULL) { 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null jstring (%s)\n", func); 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj->clazz != gDvm.classJavaLangString) { 516ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden /* 517ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden * TODO: we probably should test dvmIsValidObject first, because 518ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden * this will crash if "obj" is non-null but pointing to an invalid 519ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden * memory region. However, the "is valid" test is a little slow, 520ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden * we're doing it again over in checkObject(). 521ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden */ 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsValidObject(obj)) 523ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: jstring %p points to non-string object (%s)\n", 524ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden jstr, func); 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 526ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: jstring %p is bogus (%s)\n", jstr, func); 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 529702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 533702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 534ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden checkObject(env, jstr, func); 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "bytes" points to valid "modified UTF-8" data. 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkUtfString(JNIEnv* env, const char* bytes, bool nullOk, 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* func) 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* origBytes = bytes; 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (bytes == NULL) { 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!nullOk) { 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: unexpectedly null UTF string\n"); 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (*bytes != '\0') { 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 utf8 = *(bytes++); 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Switch on the high four bits. 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (utf8 >> 4) { 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x00: 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x01: 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x02: 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x03: 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x04: 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x05: 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x06: 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x07: { 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 0xxx. No need for any extra bytes. 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x08: 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x09: 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0a: 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0b: 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0f: { 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Bit pattern 10xx or 1111, which are illegal start bytes. 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: 1111 is valid for normal UTF-8, but not the 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * modified UTF-8 used here. 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal start byte 0x%x\n", utf8); 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0e: { 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 1110, so there are two additional bytes. 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf8 = *(bytes++); 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((utf8 & 0xc0) != 0x80) { 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8); 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Fall through to take care of the final byte. 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0c: 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0x0d: { 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Bit pattern 110x, so there is one additional byte. 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf8 = *(bytes++); 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((utf8 & 0xc0) != 0x80) { 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8); 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfail: 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" string: '%s'\n", origBytes); 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some circumstances the VM will screen class names, but it doesn't 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for class lookup. When things get bounced through a class loader, they 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * can actually get normalized a couple of times; as a result, passing in 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a class name like "java.lang.Thread" instead of "java/lang/Thread" will 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * work in some circumstances. 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is incorrect and could cause strange behavior or compatibility 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * problems, so we want to screen that out here. 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We expect "full-qualified" class names, like "java/lang/Thread" or 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "[Ljava/lang/Object;". 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkClassName(JNIEnv* env, const char* className, const char* func) 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* cp; 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* quick check for illegal chars */ 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cp = className; 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (*cp != '\0') { 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (*cp == '.') 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto fail; 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cp++; 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // TODO: need a more rigorous check here 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfail: 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: illegal class name '%s' (%s)\n", className, func); 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that "array" is non-NULL and points to an Array object. 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Since we're dealing with objects, switch to "running" mode. 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 651ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkArray(JNIEnv* env, jarray jarr, const char* func) 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNI_ENTER(); 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 656ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* obj = dvmDecodeIndirectRef(env, jarr); 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == NULL) { 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: received null array (%s)\n", func); 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj->clazz->descriptor[0] != '[') { 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsValidObject(obj)) 663ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: jarray %p points to non-array object (%s)\n", 664ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden jarr, obj->clazz->descriptor); 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 666ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden LOGW("JNI WARNING: jarray %p is bogus\n", jarr); 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 670702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 671702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 674702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden else 675ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden checkObject(env, jarr, func); 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the "mode" argument passed to a primitive array Release 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * function is one of the valid values. 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkReleaseMode(JNIEnv* env, jint mode, const char* func) 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mode != 0 && mode != JNI_COMMIT && mode != JNI_ABORT) { 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: bad value for mode (%d) (%s)\n", mode, func); 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the length argument to array-creation calls is >= 0. 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkLengthPositive(JNIEnv* env, jsize length, const char* func) 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (length < 0) { 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: negative length for array allocation (%s)\n", func); 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the pointer value is non-NULL. 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkNonNull(JNIEnv* env, const void* ptr, const char* func) 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ptr == NULL) { 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: invalid null pointer (%s)\n", func); 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the method's return type matches the type of call. 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "expectedSigByte" will be 'L' for all objects, including arrays. 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void checkSig(JNIEnv* env, jmethodID methodID, char expectedSigByte, 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isStatic, const char* func) 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const Method* meth = (const Method*) methodID; 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool printWarn = false; 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (expectedSigByte != meth->shorty[0]) { 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: expected return type '%c'\n", expectedSigByte); 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (isStatic && !dvmIsStaticMethod(meth)) { 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isStatic) 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: calling non-static method with static call\n"); 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: calling static method with non-static call\n"); 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printWarn = true; 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printWarn) { 735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* desc = dexProtoCopyMethodDescriptor(&meth->prototype); 736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" calling %s.%s %s\n", 737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth->clazz->descriptor, meth->name, desc); 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(desc); 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project showLocation(dvmGetCurrentJNIMethod(), func); 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that this static field ID is valid for this class. 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 747ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkStaticFieldID(JNIEnv* env, jclass jclazz, jfieldID fieldID) 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 749ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ClassObject* clazz = (ClassObject*) dvmDecodeIndirectRef(env, jclazz); 750ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden StaticField* base = clazz->sfields; 751ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden int fieldCount = clazz->sfieldCount; 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((StaticField*) fieldID < base || 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (StaticField*) fieldID >= base + fieldCount) 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: static fieldID %p not valid for class %s\n", 757ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden fieldID, clazz->descriptor); 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW(" base=%p count=%d\n", base, fieldCount); 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that this instance field ID is valid for this object. 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 766ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void checkInstanceFieldID(JNIEnv* env, jobject jobj, jfieldID fieldID, 7671cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden const char* func) 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 769702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_ENTER(); 770702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 771ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden if (jobj == NULL) { 7721cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden LOGW("JNI WARNING: invalid null object (%s)\n", func); 7731cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden abortMaybe(); 774702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden goto bail; 7751cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden } 7761cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden 777ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden Object* obj = dvmDecodeIndirectRef(env, jobj); 778ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ClassObject* clazz = obj->clazz; 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check this class and all of its superclasses for a matching field. 782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Don't need to scan interfaces. 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (clazz != NULL) { 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((InstField*) fieldID >= clazz->ifields && 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (InstField*) fieldID < clazz->ifields + clazz->ifieldCount) 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 788702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden goto bail; 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz = clazz->super; 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: inst fieldID %p not valid for class %s\n", 795ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden fieldID, obj->clazz->descriptor); 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 797702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden 798702e2486cdabe6df3ec64e752db2958537a11b35Andy McFaddenbail: 799702e2486cdabe6df3ec64e752db2958537a11b35Andy McFadden JNI_EXIT(); 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Guarded arrays 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardLen 512 /* must be multiple of 2 */ 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardPattern 0xd5e3 /* uncommon values; d5e3d5e3 invalid addr */ 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardMagic 0xffd5aa96 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kGuardExtra sizeof(GuardExtra) 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this gets tucked in at the start of the buffer; struct size must be even */ 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct GuardExtra { 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 magic; 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler; 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t originalLen; 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const void* originalPtr; 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} GuardExtra; 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* find the GuardExtra given the pointer into the "live" data */ 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinline static GuardExtra* getGuardExtra(const void* dataBuf) 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* fullBuf = ((u1*) dataBuf) - kGuardLen / 2; 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (GuardExtra*) fullBuf; 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create an oversized buffer to hold the contents of "buf". Copy it in, 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * filling in the area around it with guard data. 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We use a 16-bit pattern to make a rogue memset less likely to elude us. 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* createGuardedCopy(const void* buf, size_t len, bool modOkay) 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GuardExtra* pExtra; 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t newLen = (len + kGuardLen +1) & ~0x01; 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* newBuf; 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2* pat; 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i; 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newBuf = (u1*)malloc(newLen); 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newBuf == NULL) { 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("createGuardedCopy failed on alloc of %d bytes\n", newLen); 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* fill it in with a pattern */ 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) newBuf; 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = 0; i < (int)newLen / 2; i++) 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *pat++ = kGuardPattern; 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* copy the data in; note "len" could be zero */ 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memcpy(newBuf + kGuardLen / 2, buf, len); 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* if modification is not expected, grab a checksum */ 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler = 0; 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!modOkay) { 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(0L, Z_NULL, 0); 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(adler, buf, len); 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *(uLong*)newBuf = adler; 863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra = (GuardExtra*) newBuf; 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->magic = kGuardMagic; 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->adler = adler; 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->originalPtr = buf; 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->originalLen = len; 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return newBuf + kGuardLen / 2; 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify the guard area and, if "modOkay" is false, that the data itself 876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has not been altered. 87744a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * 87844a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * The caller has already checked that "dataBuf" is non-NULL. 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic bool checkGuardedCopy(const void* dataBuf, bool modOkay) 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 88244a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden static const u4 kMagicCmp = kGuardMagic; 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* fullBuf = ((const u1*) dataBuf) - kGuardLen / 2; 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 88544a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden size_t len; 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u2* pat; 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i; 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 88944a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden /* 89044a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * Before we do anything with "pExtra", check the magic number. We 89144a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * do the check with memcmp rather than "==" in case the pointer is 89244a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * unaligned. If it points to completely bogus memory we're going 89344a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden * to crash, but there's no easy way around that. 89444a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden */ 89544a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden if (memcmp(&pExtra->magic, &kMagicCmp, 4) != 0) { 89644a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden u1 buf[4]; 89744a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden memcpy(buf, &pExtra->magic, 4); 89844a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden LOGE("JNI: guard magic does not match (found 0x%02x%02x%02x%02x) " 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "-- incorrect data pointer %p?\n", 90044a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden buf[3], buf[2], buf[1], buf[0], dataBuf); /* assume little endian */ 901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90444a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden len = pExtra->originalLen; 90544a3484d9ba75aa88c0f3187a9c0ef56e892771bAndy McFadden 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check bottom half of guard; skip over optional checksum storage */ 907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) fullBuf; 908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = kGuardExtra / 2; i < (int) (kGuardLen / 2 - kGuardExtra) / 2; i++) 909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pat[i] != kGuardPattern) { 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern(1) disturbed at %p + %d\n", 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, i*2); 913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int offset = kGuardLen / 2 + len; 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (offset & 0x01) { 919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* odd byte; expected value depends on endian-ness of host */ 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u2 patSample = kGuardPattern; 921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fullBuf[offset] != ((const u1*) &patSample)[1]) { 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern disturbed in odd byte after %p " 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "(+%d) 0x%02x 0x%02x\n", 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, offset, fullBuf[offset], ((const u1*) &patSample)[1]); 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project offset++; 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* check top half of guard */ 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pat = (u2*) (fullBuf + offset); 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = 0; i < kGuardLen / 4; i++) { 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pat[i] != kGuardPattern) { 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: guard pattern(2) disturbed at %p + %d\n", 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fullBuf, offset + i*2); 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If modification is not expected, verify checksum. Strictly speaking 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this is wrong: if we told the client that we made a copy, there's no 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reason they can't alter the buffer. 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!modOkay) { 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project uLong adler = adler32(0L, Z_NULL, 0); 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adler = adler32(adler, dataBuf, len); 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pExtra->adler != adler) { 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: buffer modified (0x%08lx vs 0x%08lx) at addr %p\n", 950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pExtra->adler, adler, dataBuf); 951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free up the guard buffer, scrub it, and return the original pointer. 960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* freeGuardedCopy(void* dataBuf) 962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* fullBuf = ((u1*) dataBuf) - kGuardLen / 2; 964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* originalPtr = (void*) pExtra->originalPtr; 966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t len = pExtra->originalLen; 967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memset(dataBuf, len, 0xdd); 969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(fullBuf); 970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return originalPtr; 971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Just pull out the original pointer. 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* getGuardedCopyOriginalPtr(const void* dataBuf) 977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (void*) pExtra->originalPtr; 980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Grab the data length. 984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic size_t getGuardedCopyOriginalLen(const void* dataBuf) 986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const GuardExtra* pExtra = getGuardExtra(dataBuf); 988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pExtra->originalLen; 989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the width, in bytes, of a primitive type. 993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic int dvmPrimitiveTypeWidth(PrimitiveType primType) 995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const int lengths[PRIM_MAX] = { 997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1, // boolean 998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2, // char 999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4, // float 1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8, // double 1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1, // byte 1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2, // short 1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4, // int 1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8, // long 1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project -1, // void 1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(primType >= 0 && primType < PRIM_MAX); 1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return lengths[primType]; 1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a guarded copy of a primitive array. Modifications to the copied 1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data are allowed. Returns a pointer to the copied data. 1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1015ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void* createGuardedPACopy(JNIEnv* env, const jarray jarr, 1016ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden jboolean* isCopy) 1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1018ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ArrayObject* arrObj = (ArrayObject*) dvmDecodeIndirectRef(env, jarr); 1019ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden PrimitiveType primType = arrObj->obj.clazz->elementClass->primitiveType; 1020ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden int len = arrObj->length * dvmPrimitiveTypeWidth(primType); 1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* result; 1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1023ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden result = createGuardedCopy(arrObj->contents, len, true); 1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Perform the array "release" operation, which may or may not copy data 1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * back into the VM, and may or may not release the underlying storage. 1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1035ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFaddenstatic void* releaseGuardedPACopy(JNIEnv* env, jarray jarr, void* dataBuf, 1036ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden int mode) 1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1038ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden ArrayObject* arrObj = (ArrayObject*) dvmDecodeIndirectRef(env, jarr); 1039ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden PrimitiveType primType = arrObj->obj.clazz->elementClass->primitiveType; 1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //int len = array->length * dvmPrimitiveTypeWidth(primType); 1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool release, copyBack; 1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* result; 1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(dataBuf, true)) { 1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in releaseGuardedPACopy\n"); 1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 10471cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return NULL; 1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (mode) { 1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 0: 1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = copyBack = true; 1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case JNI_ABORT: 1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = true; 1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project copyBack = false; 1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case JNI_COMMIT: 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project release = false; 1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project copyBack = true; 1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: bad release mode %d\n", mode); 1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmAbort(); 1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (copyBack) { 1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t len = getGuardedCopyOriginalLen(dataBuf); 1070ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden memcpy(arrObj->contents, dataBuf, len); 1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (release) { 1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (u1*) freeGuardedCopy(dataBuf); 1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (u1*) getGuardedCopyOriginalPtr(dataBuf); 1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer is to the array contents; back up to the array object */ 1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result -= offsetof(ArrayObject, contents); 1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI functions 1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetVersion(JNIEnv* env) 1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetVersion(env); 1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_DefineClass(JNIEnv* env, const char* name, jobject loader, 1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jbyte* buf, jsize bufLen) 1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, loader); 1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS_NAME(env, name); 1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->DefineClass(env, name, loader, buf, bufLen); 1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_FindClass(JNIEnv* env, const char* name) 1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS_NAME(env, name); 1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FindClass(env, name); 1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_GetSuperclass(JNIEnv* env, jclass clazz) 1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetSuperclass(env, clazz); 1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsAssignableFrom(JNIEnv* env, jclass clazz1, 1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz2) 1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz1); 1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz2); 1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsAssignableFrom(env, clazz1, clazz2); 1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_FromReflectedMethod(JNIEnv* env, jobject method) 1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, method); 1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FromReflectedMethod(env, method); 1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_FromReflectedField(JNIEnv* env, jobject field) 1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, field); 1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->FromReflectedField(env, field); 1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_ToReflectedMethod(JNIEnv* env, jclass cls, 1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, jboolean isStatic) 1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, cls); 1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ToReflectedMethod(env, cls, methodID, isStatic); 1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, 1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean isStatic) 1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, cls); 1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ToReflectedField(env, cls, fieldID, isStatic); 1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_Throw(JNIEnv* env, jthrowable obj) 1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Throw(env, obj); 1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_ThrowNew(JNIEnv* env, jclass clazz, const char* message) 1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, message, true); 1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ThrowNew(env, clazz, message); 1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jthrowable Check_ExceptionOccurred(JNIEnv* env) 1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jthrowable result; 1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ExceptionOccurred(env); 1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ExceptionDescribe(JNIEnv* env) 1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ExceptionDescribe(env); 1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ExceptionClear(JNIEnv* env) 1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ExceptionClear(env); 1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_FatalError(JNIEnv* env, const char* msg) 1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, msg, true); 1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->FatalError(env, msg); 1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_PushLocalFrame(JNIEnv* env, jint capacity) 1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->PushLocalFrame(env, capacity); 1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_PopLocalFrame(JNIEnv* env, jobject res) 1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, res); 1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->PopLocalFrame(env, res); 1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewGlobalRef(JNIEnv* env, jobject obj) 1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewGlobalRef(env, obj); 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 void Check_DeleteGlobalRef(JNIEnv* env, jobject localRef) 1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, localRef); 1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteGlobalRef(env, localRef); 1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewLocalRef(JNIEnv* env, jobject ref) 1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref); 1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewLocalRef(env, ref); 1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_DeleteLocalRef(JNIEnv* env, jobject globalRef) 1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, globalRef); 1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteLocalRef(env, globalRef); 1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_EnsureLocalCapacity(JNIEnv *env, jint capacity) 1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->EnsureLocalCapacity(env, capacity); 1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsSameObject(JNIEnv* env, jobject ref1, jobject ref2) 1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref1); 1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, ref2); 1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsSameObject(env, ref1, ref2); 1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_AllocObject(JNIEnv* env, jclass clazz) 1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->AllocObject(env, clazz); 1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, 1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ...) 1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; 1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); 1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectV(env, clazz, methodID, args); 1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); 1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, 1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args) 1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectV(env, clazz, methodID, args); 1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, 1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jvalue* args) 1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectA(env, clazz, methodID, args); 1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jclass Check_GetObjectClass(JNIEnv* env, jobject obj) 1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass result; 1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectClass(env, obj); 1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz) 1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->IsInstanceOf(env, obj, clazz); 1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_GetMethodID(JNIEnv* env, jclass clazz, const char* name, 1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* sig) 1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetMethodID(env, clazz, name, sig); 1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_GetFieldID(JNIEnv* env, jclass clazz, 1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetFieldID(env, clazz, name, sig); 1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jmethodID Check_GetStaticMethodID(JNIEnv* env, jclass clazz, 1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID result; 1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStaticMethodID(env, clazz, name, sig); 1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jfieldID Check_GetStaticFieldID(JNIEnv* env, jclass clazz, 1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name, const char* sig) 1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, name, false); 1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, sig, false); 1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID result; 1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStaticFieldID(env, clazz, name, sig); 1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 143525b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden#define GET_STATIC_TYPE_FIELD(_ctype, _jname) \ 1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_GetStatic##_jname##Field(JNIEnv* env, jclass clazz, \ 1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID) \ 1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype result; \ 1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkStaticFieldID(env, clazz, fieldID); \ 1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStatic##_jname##Field(env, clazz, \ 1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldID); \ 1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144825b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jobject, Object); 144925b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jboolean, Boolean); 145025b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jbyte, Byte); 145125b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jchar, Char); 145225b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jshort, Short); 145325b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jint, Int); 145425b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jlong, Long); 145525b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jfloat, Float); 145625b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_STATIC_TYPE_FIELD(jdouble, Double); 1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_STATIC_TYPE_FIELD(_ctype, _jname, _ftype) \ 1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_SetStatic##_jname##Field(JNIEnv* env, jclass clazz, \ 1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID, _ctype value) \ 1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project checkStaticFieldID(env, clazz, fieldID); \ 1465ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden CHECK_FIELD_TYPE(env, (jobject)(u4)value, fieldID, _ftype, true); \ 1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->SetStatic##_jname##Field(env, clazz, fieldID, \ 1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value); \ 1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jobject, Object, PRIM_NOT); 1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jboolean, Boolean, PRIM_BOOLEAN); 1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jbyte, Byte, PRIM_BYTE); 1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jchar, Char, PRIM_CHAR); 1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jshort, Short, PRIM_SHORT); 1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jint, Int, PRIM_INT); 1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jlong, Long, PRIM_LONG); 1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jfloat, Float, PRIM_FLOAT); 1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_STATIC_TYPE_FIELD(jdouble, Double, PRIM_DOUBLE); 1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148025b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden#define GET_TYPE_FIELD(_ctype, _jname) \ 1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Get##_jname##Field(JNIEnv* env, jobject obj, \ 1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID) \ 1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype result; \ 14871cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden CHECK_INST_FIELD_ID(env, obj, fieldID); \ 1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Get##_jname##Field(env, obj, fieldID); \ 1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 149225b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jobject, Object); 149325b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jboolean, Boolean); 149425b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jbyte, Byte); 149525b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jchar, Char); 149625b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jshort, Short); 149725b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jint, Int); 149825b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jlong, Long); 149925b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jfloat, Float); 150025b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenGET_TYPE_FIELD(jdouble, Double); 1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_TYPE_FIELD(_ctype, _jname, _ftype) \ 1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Set##_jname##Field(JNIEnv* env, jobject obj, \ 1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jfieldID fieldID, _ctype value) \ 1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 15081cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden CHECK_INST_FIELD_ID(env, obj, fieldID); \ 1509ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden CHECK_FIELD_TYPE(env, (jobject)(u4) value, fieldID, _ftype, false); \ 1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Set##_jname##Field(env, obj, fieldID, value); \ 1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jobject, Object, PRIM_NOT); 1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jboolean, Boolean, PRIM_BOOLEAN); 1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jbyte, Byte, PRIM_BYTE); 1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jchar, Char, PRIM_CHAR); 1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jshort, Short, PRIM_SHORT); 1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jint, Int, PRIM_INT); 1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jlong, Long, PRIM_LONG); 1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jfloat, Float, PRIM_FLOAT); 1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSET_TYPE_FIELD(jdouble, Double, PRIM_DOUBLE); 1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152325b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden#define CALL_VIRTUAL(_ctype, _jname, _retdecl, _retasgn, _retok, _retsig) \ 1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##Method(JNIEnv* env, jobject obj, \ 1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, ...) \ 1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodV(env, obj, methodID, \ 1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##MethodV(JNIEnv* env, jobject obj, \ 1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, va_list args) \ 1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodV(env, obj, methodID, \ 1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_Call##_jname##MethodA(JNIEnv* env, jobject obj, \ 1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmethodID methodID, jvalue* args) \ 1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->Call##_jname##MethodA(env, obj, methodID, \ 1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args); \ 1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 156325b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jobject, Object, Object* result, result=, result, 'L'); 156425b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jboolean, Boolean, jboolean result, result=, result, 'Z'); 156525b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jbyte, Byte, jbyte result, result=, result, 'B'); 156625b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jchar, Char, jchar result, result=, result, 'C'); 156725b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jshort, Short, jshort result, result=, result, 'S'); 156825b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jint, Int, jint result, result=, result, 'I'); 156925b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jlong, Long, jlong result, result=, result, 'J'); 157025b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jfloat, Float, jfloat result, result=, result, 'F'); 157125b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(jdouble, Double, jdouble result, result=, result, 'D'); 157225b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_VIRTUAL(void, Void, , , , 'V'); 157325b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden 157425b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden#define CALL_NONVIRTUAL(_ctype, _jname, _retdecl, _retasgn, _retok, \ 157525b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden _retsig) \ 1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##Method(JNIEnv* env, \ 1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, ...) \ 1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodV(env, obj, \ 1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##MethodV(JNIEnv* env, \ 1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, va_list args) \ 1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodV(env, obj, \ 1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallNonvirtual##_jname##MethodA(JNIEnv* env, \ 1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject obj, jclass clazz, jmethodID methodID, jvalue* args) \ 1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); \ 1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, false); \ 1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallNonvirtual##_jname##MethodA(env, obj, \ 1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz, methodID, args); \ 1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 161825b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jobject, Object, Object* result, result=, result, 'L'); 161925b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jboolean, Boolean, jboolean result, result=, result, 'Z'); 162025b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jbyte, Byte, jbyte result, result=, result, 'B'); 162125b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jchar, Char, jchar result, result=, result, 'C'); 162225b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jshort, Short, jshort result, result=, result, 'S'); 162325b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jint, Int, jint result, result=, result, 'I'); 162425b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jlong, Long, jlong result, result=, result, 'J'); 162525b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jfloat, Float, jfloat result, result=, result, 'F'); 162625b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(jdouble, Double, jdouble result, result=, result, 'D'); 162725b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_NONVIRTUAL(void, Void, , , , 'V'); 162825b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden 162925b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden 163025b68266e06c0217b4c8871323da4d665795fa8aAndy McFadden#define CALL_STATIC(_ctype, _jname, _retdecl, _retasgn, _retok, _retsig) \ 1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##Method(JNIEnv* env, \ 1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, ...) \ 1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_list args; \ 1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_start(args, methodID); \ 1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodV(env, clazz, \ 1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project va_end(args); \ 1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##MethodV(JNIEnv* env, \ 1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, va_list args) \ 1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodV(env, clazz, \ 1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype Check_CallStatic##_jname##MethodA(JNIEnv* env, \ 1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass clazz, jmethodID methodID, jvalue* args) \ 1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); \ 1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_SIG(env, methodID, _retsig, true); \ 1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retdecl; \ 1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _retasgn BASE_ENV(env)->CallStatic##_jname##MethodA(env, clazz, \ 1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodID, args); \ 1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return _retok; \ 1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167025b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jobject, Object, Object* result, result=, result, 'L'); 167125b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jboolean, Boolean, jboolean result, result=, result, 'Z'); 167225b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jbyte, Byte, jbyte result, result=, result, 'B'); 167325b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jchar, Char, jchar result, result=, result, 'C'); 167425b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jshort, Short, jshort result, result=, result, 'S'); 167525b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jint, Int, jint result, result=, result, 'I'); 167625b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jlong, Long, jlong result, result=, result, 'J'); 167725b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jfloat, Float, jfloat result, result=, result, 'F'); 167825b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(jdouble, Double, jdouble result, result=, result, 'D'); 167925b68266e06c0217b4c8871323da4d665795fa8aAndy McFaddenCALL_STATIC(void, Void, , , , 'V'); 1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jstring Check_NewString(JNIEnv* env, const jchar* unicodeChars, 1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len) 1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jstring result; 1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewString(env, unicodeChars, len); 1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetStringLength(JNIEnv* env, jstring string) 1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringLength(env, string); 1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const jchar* Check_GetStringChars(JNIEnv* env, jstring string, 1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* result; 1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringChars(env, string, isCopy); 1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringLen(string) * 2; 1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const jchar*) createGuardedCopy(result, len, false); 1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringChars(JNIEnv* env, jstring string, 1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* chars) 1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, chars); 1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(chars, false)) { 1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringChars\n"); 1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 17281cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project chars = (const jchar*) freeGuardedCopy((jchar*)chars); 1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringChars(env, string, chars); 1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jstring Check_NewStringUTF(JNIEnv* env, const char* bytes) 1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_UTF_STRING(env, bytes, true); 1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jstring result; 1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewStringUTF(env, bytes); 1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetStringUTFLength(JNIEnv* env, jstring string) 1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringUTFLength(env, string); 1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const char* Check_GetStringUTFChars(JNIEnv* env, jstring string, 1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* result; 1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringUTFChars(env, string, isCopy); 1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringUtf8ByteLen(string) + 1; 1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const char*) createGuardedCopy(result, len, false); 1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringUTFChars(JNIEnv* env, jstring string, 1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* utf) 1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_ExcepOkay); 1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, utf); 1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //int len = dvmStringUtf8ByteLen(string) + 1; 1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(utf, false)) { 1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars\n"); 1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 17841cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project utf = (const char*) freeGuardedCopy((char*)utf); 1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringUTFChars(env, string, utf); 1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jsize Check_GetArrayLength(JNIEnv* env, jarray array) 1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize result; 1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetArrayLength(env, array); 1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobjectArray Check_NewObjectArray(JNIEnv* env, jsize length, 1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jclass elementClass, jobject initialElement) 1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, elementClass); 1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, initialElement); 1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_LENGTH_POSITIVE(env, length); 1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobjectArray result; 1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewObjectArray(env, length, elementClass, 1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project initialElement); 1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_GetObjectArrayElement(JNIEnv* env, jobjectArray array, 1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize index) 1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectArrayElement(env, array, index); 1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_SetObjectArrayElement(JNIEnv* env, jobjectArray array, 1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize index, jobject value) 1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->SetObjectArrayElement(env, array, index, value); 1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define NEW_PRIMITIVE_ARRAY(_artype, _jname) \ 1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _artype Check_New##_jname##Array(JNIEnv* env, jsize length) \ 1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_LENGTH_POSITIVE(env, length); \ 1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _artype result; \ 1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->New##_jname##Array(env, length); \ 1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jbooleanArray, Boolean); 1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jbyteArray, Byte); 1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jcharArray, Char); 1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jshortArray, Short); 1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jintArray, Int); 1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jlongArray, Long); 1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jfloatArray, Float); 1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNEW_PRIMITIVE_ARRAY(jdoubleArray, Double); 1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname) \ 1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static _ctype* Check_Get##_jname##ArrayElements(JNIEnv* env, \ 1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jboolean* isCopy) \ 1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype* result; \ 1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->Get##_jname##ArrayElements(env, \ 1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project array, isCopy); \ 1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { \ 1866ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden result = (_ctype*) createGuardedPACopy(env, array, isCopy); \ 1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; \ 1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define RELEASE_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname) \ 1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Release##_jname##ArrayElements(JNIEnv* env, \ 1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, _ctype* elems, jint mode) \ 1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); \ 1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, elems); \ 1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_RELEASE_MODE(env, mode); \ 1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { \ 1881ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden elems = (_ctype*) releaseGuardedPACopy(env, array, elems, mode);\ 1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Release##_jname##ArrayElements(env, \ 1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project array, elems, mode); \ 1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_PRIMITIVE_ARRAY_REGION(_ctype, _jname) \ 1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Get##_jname##ArrayRegion(JNIEnv* env, \ 1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jsize start, jsize len, _ctype* buf) \ 1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Get##_jname##ArrayRegion(env, array, start, \ 1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project len, buf); \ 1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_PRIMITIVE_ARRAY_REGION(_ctype, _jname) \ 1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static void Check_Set##_jname##ArrayRegion(JNIEnv* env, \ 1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _ctype##Array array, jsize start, jsize len, const _ctype* buf) \ 1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { \ 1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); \ 1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); \ 1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->Set##_jname##ArrayRegion(env, array, start, \ 1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project len, buf); \ 1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); \ 1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PRIMITIVE_ARRAY_FUNCTIONS(_ctype, _jname, _typechar) \ 1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \ 1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RELEASE_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \ 1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_PRIMITIVE_ARRAY_REGION(_ctype, _jname); \ 1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SET_PRIMITIVE_ARRAY_REGION(_ctype, _jname); 1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* TODO: verify primitive array type matches call type */ 1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jboolean, Boolean, 'Z'); 1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jbyte, Byte, 'B'); 1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jchar, Char, 'C'); 1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jshort, Short, 'S'); 1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jint, Int, 'I'); 1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jlong, Long, 'J'); 1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jfloat, Float, 'F'); 1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPRIMITIVE_ARRAY_FUNCTIONS(jdouble, Double, 'D'); 1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_RegisterNatives(JNIEnv* env, jclass clazz, 1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const JNINativeMethod* methods, jint nMethods) 1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->RegisterNatives(env, clazz, methods, nMethods); 1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_UnregisterNatives(JNIEnv* env, jclass clazz) 1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_CLASS(env, clazz); 1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->UnregisterNatives(env, clazz); 1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_MonitorEnter(JNIEnv* env, jobject obj) 1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->MonitorEnter(env, obj); 1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_MonitorExit(JNIEnv* env, jobject obj) 1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->MonitorExit(env, obj); 1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetJavaVM(JNIEnv *env, JavaVM **vm) 1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetJavaVM(env, vm); 1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_GetStringRegion(JNIEnv* env, jstring str, jsize start, 1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len, jchar* buf) 1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, str); 1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->GetStringRegion(env, str, start, len, buf); 1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, 1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jsize len, char* buf) 1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay); 1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, str); 1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->GetStringUTFRegion(env, str, start, len, buf); 1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* Check_GetPrimitiveArrayCritical(JNIEnv* env, jarray array, 1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritGet); 1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* result; 2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetPrimitiveArrayCritical(env, array, isCopy); 2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 2002ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden result = createGuardedPACopy(env, array, isCopy); 2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, 2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* carray, jint mode) 2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritRelease | kFlag_ExcepOkay); 2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ARRAY(env, array); 2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, carray); 2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_RELEASE_MODE(env, mode); 2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 2016ab00d455ea67fbf4090567bb09ead8017896ea61Andy McFadden carray = releaseGuardedPACopy(env, array, carray, mode); 2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleasePrimitiveArrayCritical(env, array, carray, mode); 2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const jchar* Check_GetStringCritical(JNIEnv* env, jstring string, 2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean* isCopy) 2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritGet); 2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* result; 2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetStringCritical(env, string, isCopy); 2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy && result != NULL) { 2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = dvmStringLen(string) * 2; 2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = (const jchar*) createGuardedCopy(result, len, false); 2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isCopy != NULL) 2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *isCopy = JNI_TRUE; 2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_ReleaseStringCritical(JNIEnv* env, jstring string, 2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const jchar* carray) 2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritRelease | kFlag_ExcepOkay); 2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_STRING(env, string); 2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_NON_NULL(env, carray); 2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((JNIEnvExt*)env)->forceDataCopy) { 2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkGuardedCopy(carray, false)) { 2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGE("JNI: failed guarded copy check in ReleaseStringCritical\n"); 2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 20491cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return; 2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project carray = (const jchar*) freeGuardedCopy((jchar*)carray); 2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->ReleaseStringCritical(env, string, carray); 2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jweak Check_NewWeakGlobalRef(JNIEnv* env, jobject obj) 2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jweak result; 2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewWeakGlobalRef(env, obj); 2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Check_DeleteWeakGlobalRef(JNIEnv* env, jweak obj) 2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default | kFlag_ExcepOkay); 2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BASE_ENV(env)->DeleteWeakGlobalRef(env, obj); 2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jboolean Check_ExceptionCheck(JNIEnv* env) 2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_CritOkay | kFlag_ExcepOkay); 2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jboolean result; 2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->ExceptionCheck(env); 2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobjectRefType Check_GetObjectRefType(JNIEnv* env, jobject obj) 2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, obj); 2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobjectRefType result; 2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->GetObjectRefType(env, obj); 2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jobject Check_NewDirectByteBuffer(JNIEnv* env, void* address, 2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jlong capacity) 2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jobject result; 2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (address == NULL || capacity < 0) { 2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)\n", 2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project address, (long) capacity); 2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abortMaybe(); 21031cf3b27e857824af08bab76489b6e25a213edc8dAndy McFadden return NULL; 2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_ENV(env)->NewDirectByteBuffer(env, address, capacity); 2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void* Check_GetDirectBufferAddress(JNIEnv* env, jobject buf) 2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, buf); 21148e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden void* result = BASE_ENV(env)->GetDirectBufferAddress(env, buf); 2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 21168e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21178e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden /* optional - check result vs. "safe" implementation */ 21188e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if (kRedundantDirectBufferTest) { 21198e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden jobject platformAddr = NULL; 21208e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden void* checkResult = NULL; 21218e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21228e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden /* 21238e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * Start by determining if the object supports the DirectBuffer 21248e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * interfaces. Note this does not guarantee that it's a direct buffer. 21258e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden */ 21268e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if (JNI_FALSE == (*env)->IsInstanceOf(env, buf, 21278e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden (jclass) gDvm.classOrgApacheHarmonyNioInternalDirectBuffer)) 21288e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden { 21298e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden goto bail; 21308e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden } 21318e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21328e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden /* 21338e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * Get the PlatformAddress object. 21348e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * 21358e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * If this isn't a direct buffer, platformAddr will be NULL and/or an 21368e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden * exception will have been thrown. 21378e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden */ 21388e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden platformAddr = (*env)->CallObjectMethod(env, buf, 21398e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden (jmethodID) gDvm.methOrgApacheHarmonyNioInternalDirectBuffer_getEffectiveAddress); 21408e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21418e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if ((*env)->ExceptionCheck(env)) { 21428e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden (*env)->ExceptionClear(env); 21438e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden platformAddr = NULL; 21448e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden } 21458e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if (platformAddr == NULL) { 21468e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden LOGV("Got request for address of non-direct buffer\n"); 21478e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden goto bail; 21488e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden } 21498e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21508e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden Method* toLong = ((Object*)platformAddr)->clazz->vtable[ 21518e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden gDvm.voffOrgApacheHarmonyLuniPlatformPlatformAddress_toLong]; 21528e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden checkResult = (void*)(u4)(*env)->CallLongMethod(env, platformAddr, 21538e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden (jmethodID)toLong); 21548e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21558e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden bail: 21568e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if (platformAddr != NULL) 21578e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden (*env)->DeleteLocalRef(env, platformAddr); 21588e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 21598e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden if (result != checkResult) { 21608e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden LOGW("JNI WARNING: direct buffer result mismatch (%p vs %p)\n", 21618e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden result, checkResult); 21628e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden abortMaybe(); 21638e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden /* keep going */ 21648e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden } 21658e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden } 21668e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden 2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jlong Check_GetDirectBufferCapacity(JNIEnv* env, jobject buf) 2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_ENTER(env, kFlag_Default); 2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_OBJECT(env, buf); 21748e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden /* TODO: verify "buf" is an instance of java.nio.Buffer */ 21758e5c78470229fd2f5474574081eaa4a2286aafeaAndy McFadden jlong result = BASE_ENV(env)->GetDirectBufferCapacity(env, buf); 2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_EXIT(env); 2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI invocation functions 2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_DestroyJavaVM(JavaVM* vm) 2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->DestroyJavaVM(vm); 2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, false); 2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, 2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* thr_args) 2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->AttachCurrentThread(vm, p_env, thr_args); 2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, 2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* thr_args) 2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, false); 2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->AttachCurrentThreadAsDaemon(vm, p_env, thr_args); 2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_DetachCurrentThread(JavaVM* vm) 2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, true); 2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->DetachCurrentThread(vm); 2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, false); 2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic jint Check_GetEnv(JavaVM* vm, void** env, jint version) 2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMENTER(vm, true); 2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jint result; 2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = BASE_VM(vm)->GetEnv(vm, env, version); 2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_VMEXIT(vm, true); 2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Function tables 2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * =========================================================================== 2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const struct JNINativeInterface gCheckNativeInterface = { 2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetVersion, 2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DefineClass, 2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FindClass, 2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FromReflectedMethod, 2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FromReflectedField, 2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ToReflectedMethod, 2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetSuperclass, 2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsAssignableFrom, 2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ToReflectedField, 2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_Throw, 2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ThrowNew, 2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionOccurred, 2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionDescribe, 2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionClear, 2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_FatalError, 2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_PushLocalFrame, 2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_PopLocalFrame, 2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewGlobalRef, 2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteGlobalRef, 2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteLocalRef, 2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsSameObject, 2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewLocalRef, 2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_EnsureLocalCapacity, 2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AllocObject, 2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObject, 2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectV, 2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectA, 2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectClass, 2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_IsInstanceOf, 2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetMethodID, 2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethod, 2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethodV, 2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallObjectMethodA, 2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethod, 2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethodV, 2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallBooleanMethodA, 2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethod, 2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethodV, 2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallByteMethodA, 2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethod, 2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethodV, 2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallCharMethodA, 2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethod, 2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethodV, 2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallShortMethodA, 2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethod, 2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethodV, 2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallIntMethodA, 2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethod, 2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethodV, 2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallLongMethodA, 2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethod, 2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethodV, 2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallFloatMethodA, 2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethod, 2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethodV, 2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallDoubleMethodA, 2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethod, 2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethodV, 2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallVoidMethodA, 2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethod, 2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethodV, 2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualObjectMethodA, 2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethod, 2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethodV, 2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualBooleanMethodA, 2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethod, 2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethodV, 2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualByteMethodA, 2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethod, 2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethodV, 2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualCharMethodA, 2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethod, 2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethodV, 2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualShortMethodA, 2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethod, 2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethodV, 2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualIntMethodA, 2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethod, 2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethodV, 2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualLongMethodA, 2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethod, 2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethodV, 2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualFloatMethodA, 2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethod, 2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethodV, 2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualDoubleMethodA, 2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethod, 2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethodV, 2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallNonvirtualVoidMethodA, 2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFieldID, 2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectField, 2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanField, 2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteField, 2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharField, 2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortField, 2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntField, 2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongField, 2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatField, 2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleField, 2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetObjectField, 2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetBooleanField, 2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetByteField, 2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetCharField, 2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetShortField, 2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetIntField, 2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetLongField, 2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetFloatField, 2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetDoubleField, 2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticMethodID, 2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethod, 2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethodV, 2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticObjectMethodA, 2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethod, 2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethodV, 2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticBooleanMethodA, 2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethod, 2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethodV, 2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticByteMethodA, 2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethod, 2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethodV, 2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticCharMethodA, 2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethod, 2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethodV, 2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticShortMethodA, 2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethod, 2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethodV, 2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticIntMethodA, 2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethod, 2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethodV, 2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticLongMethodA, 2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethod, 2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethodV, 2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticFloatMethodA, 2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethod, 2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethodV, 2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticDoubleMethodA, 2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethod, 2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethodV, 2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_CallStaticVoidMethodA, 2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticFieldID, 2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticObjectField, 2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticBooleanField, 2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticByteField, 2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticCharField, 2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticShortField, 2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticIntField, 2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticLongField, 2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticFloatField, 2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStaticDoubleField, 2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticObjectField, 2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticBooleanField, 2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticByteField, 2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticCharField, 2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticShortField, 2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticIntField, 2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticLongField, 2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticFloatField, 2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetStaticDoubleField, 2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewString, 2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringLength, 2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringChars, 2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringChars, 2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewStringUTF, 2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFLength, 2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFChars, 2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringUTFChars, 2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetArrayLength, 2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewObjectArray, 2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectArrayElement, 2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetObjectArrayElement, 2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewBooleanArray, 2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewByteArray, 2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewCharArray, 2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewShortArray, 2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewIntArray, 2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewLongArray, 2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewFloatArray, 2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewDoubleArray, 2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanArrayElements, 2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteArrayElements, 2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharArrayElements, 2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortArrayElements, 2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntArrayElements, 2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongArrayElements, 2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatArrayElements, 2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleArrayElements, 2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseBooleanArrayElements, 2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseByteArrayElements, 2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseCharArrayElements, 2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseShortArrayElements, 2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseIntArrayElements, 2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseLongArrayElements, 2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseFloatArrayElements, 2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseDoubleArrayElements, 2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetBooleanArrayRegion, 2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetByteArrayRegion, 2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetCharArrayRegion, 2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetShortArrayRegion, 2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetIntArrayRegion, 2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetLongArrayRegion, 2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetFloatArrayRegion, 2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDoubleArrayRegion, 2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetBooleanArrayRegion, 2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetByteArrayRegion, 2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetCharArrayRegion, 2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetShortArrayRegion, 2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetIntArrayRegion, 2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetLongArrayRegion, 2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetFloatArrayRegion, 2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_SetDoubleArrayRegion, 2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_RegisterNatives, 2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_UnregisterNatives, 2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_MonitorEnter, 2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_MonitorExit, 2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetJavaVM, 2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringRegion, 2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringUTFRegion, 2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetPrimitiveArrayCritical, 2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleasePrimitiveArrayCritical, 2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetStringCritical, 2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ReleaseStringCritical, 2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewWeakGlobalRef, 2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DeleteWeakGlobalRef, 2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_ExceptionCheck, 2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_NewDirectByteBuffer, 2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDirectBufferAddress, 2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetDirectBufferCapacity, 2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetObjectRefType 2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic const struct JNIInvokeInterface gCheckInvokeInterface = { 2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NULL, 2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DestroyJavaVM, 2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AttachCurrentThread, 2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_DetachCurrentThread, 2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_GetEnv, 2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Check_AttachCurrentThreadAsDaemon, 2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Replace the normal table with the checked table. 2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUseCheckedJniEnv(JNIEnvExt* pEnv) 2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(pEnv->funcTable != &gCheckNativeInterface); 2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pEnv->baseFuncTable = pEnv->funcTable; 2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pEnv->funcTable = &gCheckNativeInterface; 2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Replace the normal table with the checked table. 2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUseCheckedJniVm(JavaVMExt* pVm) 2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(pVm->funcTable != &gCheckInvokeInterface); 2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pVm->baseFuncTable = pVm->funcTable; 2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pVm->funcTable = &gCheckInvokeInterface; 2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2549