1 /*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "simplejni native.cpp"
18 #include <android/log.h>
19
20 #include <stdio.h>
21
22 #include "jni.h"
23
24 #define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
25 #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
26 #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
27 #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
28 #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
29
30 static jint
add(JNIEnv *,jobject,jint a,jint b)31 add(JNIEnv* /*env*/, jobject /*thiz*/, jint a, jint b) {
32 int result = a + b;
33 ALOGI("%d + %d = %d", a, b, result);
34 return result;
35 }
36
37 static const char *classPathName = "com/example/android/simplejni/Native";
38
39 static JNINativeMethod methods[] = {
40 {"add", "(II)I", (void*)add },
41 };
42
43 /*
44 * Register several native methods for one class.
45 */
registerNativeMethods(JNIEnv * env,const char * className,JNINativeMethod * gMethods,int numMethods)46 static int registerNativeMethods(JNIEnv* env, const char* className,
47 JNINativeMethod* gMethods, int numMethods)
48 {
49 jclass clazz;
50
51 clazz = env->FindClass(className);
52 if (clazz == NULL) {
53 ALOGE("Native registration unable to find class '%s'", className);
54 return JNI_FALSE;
55 }
56 if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
57 ALOGE("RegisterNatives failed for '%s'", className);
58 return JNI_FALSE;
59 }
60
61 return JNI_TRUE;
62 }
63
64 /*
65 * Register native methods for all classes we know about.
66 *
67 * returns JNI_TRUE on success.
68 */
registerNatives(JNIEnv * env)69 static int registerNatives(JNIEnv* env)
70 {
71 if (!registerNativeMethods(env, classPathName,
72 methods, sizeof(methods) / sizeof(methods[0]))) {
73 return JNI_FALSE;
74 }
75
76 return JNI_TRUE;
77 }
78
79
80 // ----------------------------------------------------------------------------
81
82 /*
83 * This is called by the VM when the shared library is first loaded.
84 */
85
86 typedef union {
87 JNIEnv* env;
88 void* venv;
89 } UnionJNIEnvToVoid;
90
JNI_OnLoad(JavaVM * vm,void *)91 jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
92 {
93 UnionJNIEnvToVoid uenv;
94 uenv.venv = NULL;
95 jint result = -1;
96 JNIEnv* env = NULL;
97
98 ALOGI("JNI_OnLoad");
99
100 if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
101 ALOGE("ERROR: GetEnv failed");
102 goto bail;
103 }
104 env = uenv.env;
105
106 if (registerNatives(env) != JNI_TRUE) {
107 ALOGE("ERROR: registerNatives failed");
108 goto bail;
109 }
110
111 result = JNI_VERSION_1_4;
112
113 bail:
114 return result;
115 }
116