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