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 */ 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 LOGI("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 LOGE("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 LOGI(" 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 LOGI(" 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 */ 76 static jint android_debug_JNITest_part3(JNIEnv* env, jclass clazz, 77 jstring stringArg) 78 { 79 const char* utfChars; 80 jboolean isCopy; 81 82 LOGI("JNI test: in part3\n"); 83 84 utfChars = env->GetStringUTFChars(stringArg, &isCopy); 85 86 LOGI(" 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 }; 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