java代码
package com.example.test;
package android.util.Log;
public class Test {
static {
try {
System.loadLibrary(“healthmonitor_jni”);
} catch (SecurityException ex) {
Log.e(TAG, “System.loadLibrary SecurityException “ + ex);
} catch (NullPointerException ex) {
Log.e(TAG, “System.loadLibrary NullPointerException “ + ex);
} catch (UnsatisfiedLinkError ex) {
Log.e(TAG, “System.loadLibrary UnsatisfiedLinkError “ + ex);
}
}
public Test () {
Log.d(TAG, "Test construct");
native_register();
}
public static void TestCallBack(int a, int b) {
}
private native void native_register();
private native void native_release();
}
jni代码
#include <jni.j>
#include <stdio.h>
#include <nativehelper/JNIHelp.h>
#include <Utils/Log.h>
#define JAVA_CLASSNAME_TEST "com.example.test.Test"
using namespace std;
using namespace android;
static JavaVM *mJvm;
static jclass mClazz;
static jmethodID mCallbackMethod;
static JNIEnv *get_env() {
if (mJvm == NULL) return NULL;
JNIEnv *env = NULL;
int status = mJvm->GetEnv((void**) &env, JNI_VERSION_1_4);
if (status == JNI_EDETACHED || env == NULL) {
status = mJvm->AttachCurrentThread(&env, NULL);
if (status < 0) {
env = NULL;
}
}
return env;
}
static void com_example_callback(int a, int b) {
JNIEnv *env = get_env();
env->CallStaticVoidMethod(mClazz, mCallbackMethod ,
a, b);
}
static void com_example_register(JNIEnv *env, jobject thiz) {
mTest->register(com_example_callback);
}
static void com_example_release(JNIEnv *env, jobject thiz) {
(*mJvm)->DetachCurrentThread(*mJvm);
(*mJvm)->DestroyJavaVM(mJvm);
return 0;
}
static JNINativeMethod sMethods[] = {
{“native_register”, “()V”, (void )com_example_register}
{“native_release”, “()V”, (void )com_example_release}
};
static int register_HealthMonitor_jni(JNIEnv *env) {
return jniRegisterNativeMethods(env, JAVA_CLASSNAME_HEALTHMONITOR,
sMethods, NELEM(sMethods));
}
jint JNI_OnLoad(JavaVM* vm, void* ) {
mJvm = vm;
JNIEnv env = NULL;
jint result = -1;
jclass tmpClazz = NULL;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
goto bail;
}
assert(env != NULL);
tmpClazz = env->FindClass(JAVA_CLASSNAME_HEALTHMONITOR);
mClazz = (jclass)env->NewGlobalRef(tmpClazz);
mCallbackMethod = env->GetStaticMethodID(mClazz, “TestCallBack”, “(II)V”);
if (register_HealthMonitor_jni(env) < 0) {
goto bail;
}
result = JNI_VERSION_1_4;
bail:
return result;
}