在JNI的大多数教程中,使用最普遍的就是通过javah命令生成头文件的方式实现注册,这种注册称之为JNI静态注册。而JNI动态注册要弄懂就需要花费一些精力在源码上面了,今天在这里先将JNI动态注册的代码先记录下来:
例如在我要注册一个Java类中的native方法:
public native void setName(String name);
那么我们需要在我们的native_lib.c文件中声明一个static const JNINativeMethod gMethods []
static const JNIMethod gMethods [] ={
{"setName",//要注册的java函数名
"(Ljava/lang/string)V",//要注册的java方法的参数以及返回值签名
(void*)nativie_setName//jni具体实现方法指针
}
static int registerNatives(JNIEnv * env){
jclass clazz = (*env) -> FindClass(env, "com/demo/Text.class");//通过文件绝对路径获取jclass
(*env)->Register(env, clazz, gMethods, NELEM(gMethods));//调用JNIEnv的RegisterNative函数注册,NELEM(gMethods)是用来计算gMethods的大小
}
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
LOGI("jni_OnLoad begin");//需要自定义日志#include <android/log.h>
JNIEnv* env = NULL;
jint result = -1;
if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGI("ERROR: GetEnv failed\n");
return -1;
}
assert(env != NULL);//需要添加#include <assert.h>
registerNatives(env);
return JNI_VERSION_1_4;//在源码中已经写死,正确的JNI_VERSION必须是JNI_VERSION_1_2或JNI_VERSION_1_4或JNI_VERSION_1_6
}
在Android Studio运行Android工程即可。