Android ndk另一种注册方式

时间:2022-04-21 10:01:15

不使用Java_com_xxx方式调用ndk的方式,这种方法的优点是灵活,可配置,不必限制在Java_com_xxx命名依赖中。

步骤如下:

第1步,在JNI初始化方法中调用自定义注册方法,并判断成功与否通知Java端。

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
sVm = vm; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK)
return JNI_ERR;
if (注册方法(env) == JNI_OK)
return JNI_VERSION_1_4; return JNI_ERR;
}

第2步,在cpp或c文件(位置任意)中声明JNINativeMethod 方法数组

static JNINativeMethod methods[] = {
"nativeInit", "()V", (void*) xxx_init, //这样就可以映射到java的nativeInit方法了
"", "", (void *) xxx
};

其中 JNINativeMethod  的定义在 jni.h 中,结构如下:

typedef struct {
const char * name;
const char * signature;
void * fnptr;
}JNINativeMethod;

第3步,最后通过方法注入到java的jni接口中

jint custom_register_all_jni_methods(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/xxx/xxx", methods, sizeof(methods) / sizeof(methods[]));
}

com/xxx/xxx为所对应的java接口类名