1 /* //device/libs/android_runtime/android_debug_JNITest.cpp
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18 #define LOG_TAG "DebugJNI"
19
20 #include "jni.h"
21 #include "nativehelper/JNIHelp.h"
22 #include "utils/Log.h"
23 #include "utils/misc.h"
24 //#include "android_runtime/AndroidRuntime.h"
25
26 namespace android {
27
28 /*
29 * Implements:
30 * native int part1(int intArg, double doubleArg, String stringArg,
31 * int[] arrayArg)
32 */
android_debug_JNITest_part1(JNIEnv * env,jobject object,jint intArg,jdouble doubleArg,jstring stringArg,jobjectArray arrayArg)33 static jint android_debug_JNITest_part1(JNIEnv* env, jobject object,
34 jint intArg, jdouble doubleArg, jstring stringArg, jobjectArray arrayArg)
35 {
36 jclass clazz;
37 jmethodID part2id;
38 jsize arrayLen;
39 jint arrayVal;
40 int result = -2;
41
42 ALOGI("JNI test: in part1, intArg=%d, doubleArg=%.3f\n", intArg, doubleArg);
43
44 /* find "int part2(double doubleArg, int fromArray, String stringArg)" */
45 clazz = env->GetObjectClass(object);
46 part2id = env->GetMethodID(clazz,
47 "part2", "(DILjava/lang/String;)I");
48 if (part2id == NULL) {
49 ALOGE("JNI test: unable to find part2\n");
50 return -1;
51 }
52
53 /* get the length of the array */
54 arrayLen = env->GetArrayLength(arrayArg);
55 ALOGI(" array size is %d\n", arrayLen);
56
57 /*
58 * Get the last element in the array.
59 * Use the Get<type>ArrayElements functions instead if you need access
60 * to multiple elements.
61 */
62 arrayVal = (int) env->GetObjectArrayElement(arrayArg, arrayLen-1);
63 ALOGI(" array val is %d\n", arrayVal);
64
65 /* call this->part2 */
66 result = env->CallIntMethod(object, part2id,
67 doubleArg, arrayVal, stringArg);
68
69 return result;
70 }
71
72 /*
73 * Implements:
74 * private static native int part3(String stringArg);
75 */
android_debug_JNITest_part3(JNIEnv * env,jclass clazz,jstring stringArg)76 static jint android_debug_JNITest_part3(JNIEnv* env, jclass clazz,
77 jstring stringArg)
78 {
79 const char* utfChars;
80 jboolean isCopy;
81
82 ALOGI("JNI test: in part3\n");
83
84 utfChars = env->GetStringUTFChars(stringArg, &isCopy);
85
86 ALOGI(" String is '%s', isCopy=%d\n", (const char*) utfChars, isCopy);
87
88 env->ReleaseStringUTFChars(stringArg, utfChars);
89
90 return 2000;
91 }
92
93 /*
94 * JNI registration.
95 */
96 static JNINativeMethod gMethods[] = {
97 /* name, signature, funcPtr */
98 { "part1", "(IDLjava/lang/String;[I)I",
99 (void*) android_debug_JNITest_part1 },
100 { "part3", "(Ljava/lang/String;)I",
101 (void*) android_debug_JNITest_part3 },
102 };
register_android_debug_JNITest(JNIEnv * env)103 int register_android_debug_JNITest(JNIEnv* env)
104 {
105 return jniRegisterNativeMethods(env, "android/debug/JNITest",
106 gMethods, NELEM(gMethods));
107 }
108
109 #if 0
110 /* trampoline into C++ */
111 extern "C"
112 int register_android_debug_JNITest_C(JNIEnv* env)
113 {
114 return android::register_android_debug_JNITest(env);
115 }
116 #endif
117
118 }; // namespace android
119
120