native.cpp revision 76f6a86de25e1bf74717e047e55fd44b089673f3
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 "pmtest32 native.cpp"
18#include <utils/Log.h>
19
20#include <stdio.h>
21
22#include "jni.h"
23
24static jint
25add(JNIEnv *env, jobject thiz, jint a, jint b) {
26int result = a + b;
27    ALOGI("%d + %d = %d", a, b, result);
28    return result;
29}
30
31static const char *classPathName = "com/framework/shareduid/bit32/Native";
32
33static const JNINativeMethod methods[] = {
34  {"add", "(II)I", (void*)add },
35};
36
37/*
38 * Register several native methods for one class.
39 */
40static int registerNativeMethods(JNIEnv* env, const char* className,
41    const JNINativeMethod* gMethods, int numMethods)
42{
43    jclass clazz;
44
45    clazz = env->FindClass(className);
46    if (clazz == NULL) {
47        ALOGE("Native registration unable to find class '%s'", className);
48        return JNI_FALSE;
49    }
50    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
51        ALOGE("RegisterNatives failed for '%s'", className);
52        return JNI_FALSE;
53    }
54
55    return JNI_TRUE;
56}
57
58/*
59 * Register native methods for all classes we know about.
60 *
61 * returns JNI_TRUE on success.
62 */
63static int registerNatives(JNIEnv* env)
64{
65  if (!registerNativeMethods(env, classPathName,
66                 methods, sizeof(methods) / sizeof(methods[0]))) {
67    return JNI_FALSE;
68  }
69
70  return JNI_TRUE;
71}
72
73
74// ----------------------------------------------------------------------------
75
76/*
77 * This is called by the VM when the shared library is first loaded.
78 */
79
80typedef union {
81    JNIEnv* env;
82    void* venv;
83} UnionJNIEnvToVoid;
84
85jint JNI_OnLoad(JavaVM* vm, void* reserved)
86{
87    UnionJNIEnvToVoid uenv;
88    uenv.venv = NULL;
89    jint result = -1;
90    JNIEnv* env = NULL;
91
92    ALOGI("JNI_OnLoad");
93
94    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
95        ALOGE("ERROR: GetEnv failed");
96        goto bail;
97    }
98    env = uenv.env;
99
100    if (registerNatives(env) != JNI_TRUE) {
101        ALOGE("ERROR: registerNatives failed");
102        goto bail;
103    }
104
105    result = JNI_VERSION_1_4;
106
107bail:
108    return result;
109}
110