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