Android JNI动态注册

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值