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