android jni 注册函数,Android JNI学习-函数动态注册

前面JNI开发相关的也写了几篇博客,对java中native关键字定义的方法进行注册时,都是使用Javah命令生成对应的Java _ 包名 _ 类名 _ 方法名,现在完全可以通过编译器帮我们生成,我们去填对应的逻辑代码即可,这种方式被称为静态注册。今天来看一下新的方式:动态注册

不同于静态注册中在Java类中定义好native方法后由编译器生成JNI方法,动态注册基本思想是在JNI_Onload()函数中通过JNI中提供的RegisterNatives()方法来将C/C++方法和java方法对应起来, JNI_OnLoad ()函数会在我们调用 System.loadLibrary的时候回调,注册整体流程如下:

定义Java类中的native方法

编写C/C++代码, 实现JNI_Onload()方法

将Java 方法和 C/C++方法通过签名信息对应起来

通过JavaVM获取JNIEnv, JNIEnv主要用于获取Java类和调用一些JNI提供的方法

使用类名和对应起来的方法作为参数, 调用JNI提供的函数RegisterNatives()注册方法

1、Java Native方法

public native String getStringFromC();

public native int getIntFromC(int index);

2、C/C++方法

jstring returnString(JNIEnv *env, jobject instance) {

char *str = "I come from C++";

return env->NewStringUTF(str);

}

jint returnInt(JNIEnv *env, jobject instance, jint index) {

return index + 10;

}

3、JNINativeMethod

static JNINativeMethod gMethods[] = {

{"getStringFromC", "()Ljava/lang/String;", (void *) returnString},

{"getIntFromC", "(I)I", (void *) returnInt}

};

第一个参数对应的native方法名

第二个参数对应 native方法的描述

第三个参数对应的c++代码里对应的实现

通过这个数组将Java层函数和C/C++层代码对应起来

4、JNI_Onload

int JNI_OnLoad(JavaVM *vm, void *re) {

JNIEnv *env;

if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {

return JNI_ERR;

}

jclass javaClass = env->FindClass("com/david/jnitestdemo/MainActivity");

if (javaClass == NULL) {

return JNI_ERR;

}

if (env->RegisterNatives(javaClass, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {

return JNI_ERR;

}

return JNI_VERSION_1_6;

}

env->RegisterNatives(javaClass, gMethods, sizeof(gMethods) / sizeof(gMethods[0])

第一个表示对应jclass,第二个表示JNINativeMethod的数组,第三个是函数的数量

这样就完成了简单的JNI动态注册Demo

对比下之前的静态注册:

//静态注册

extern "C" JNIEXPORT jstring JNICALL

Java_com_david_jnitestdemo_MainActivity_stringFromJNI(

JNIEnv *env,

jobject /* this */) {

}

//动态注册

jstring returnString(JNIEnv *env, jobject instance) {

}

相比较来说动态注册的代码会清爽一些,虽然多了JNI_OnLoad和JNINativeMethod,但是JNI_OnLoad基本可以只写一次,JNINativeMethod每次有新增函数时才修改,所以个人感觉动态注册写代码会更舒服些,也看个人习惯 ,好了就到这里了。 -

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值