Android JNI动态注册

来源:互联网 发布:sass编译是什么源码 编辑:程序博客网 时间:2024/05/18 15:05

在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工程即可。