JNI 编程学习知识点记录

"这篇博客详细介绍了JNI编程中的关键知识点,包括extern "C"的作用、JNIEXPORT和 JNICALL的使用,以及JNI接口的命名规则。内容涵盖如何通过JNI创建Java对象、调用Java方法和修改Java对象的属性。此外,还讲解了静态和动态注册函数的方法,以实现Java Native接口的调用。示例代码展示了如何使用JNI反射修改和调用Java方法。"
摘要由CSDN通过智能技术生成

学习目标:

JNI 编程学习知识点记录

学习内容:

extern “C” 作用:避免编绎器按照C++的方式去编绎C函数

JNIEXPORT :用来表示该函数是否可导出(即:方法的可见性)
宏 JNIEXPORT 代表的就是右侧的表达式: attribute ((visibility (“default”))

JNICALL :用来表示函数的调用规范(如:__stdcall)

JNI接口命名规则:Java_< PackageName > _ < ClassName > _ < MethodName >

JNIEnv 代表了Java环境

  1. 创建Java对象
  2. 调用Java对象的方法
  3. 获取Java对象的属性等
    在这里插入图片描述

JNI中定义关键字的别名
在这里插入图片描述
在这里插入图片描述
jni反射修改java成员变量
MainActivity里有个String text;成员变量,我们来通过jni层修改这个变量的值。

Java_com_example_jnitest_MainActivity_change(JNIEnv* env,jobject thiz){
	jclass clazz = env->GetObjectClass(thiz);
	jfieldId idText = env->GetFieldID(clazz,"text","Ljava/lang/String;");
	jstring text = env->NewStringUTF("修改了这个变量");
	env->SetObjectField(thiz,idText,text);
}

jni反射调用java方法
MainActivity里有个void callback(int code)方法,我们来通过jni层修改这个变量的值。

Java_com_example_jnitest_MainActivity_call(JNIEnv* env,jobject thiz){
	jclass clazz = env->GetObjectClass(thiz);
	jMethodId idMethod = env->GetMethodId(clazz,"callback","(I)V");
	jstring text = env->NewStringUTF("修改了这个变量");
	env->callVoidMethod(thiz,idMethod,2);
}

静态注册:按照JNI规范书写函数名:Java_类路径_方法名(路径用下划线分隔)

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_dymaicimagegif_GifUtil_getWidth(JNIEnv *env, jclass clazz, jlong gif_handler) {
    GifFileType *gifFileType = reinterpret_cast<GifFileType *>(gif_handler);
    return gifFileType->SWidth;
}

动态注册:JNI_Onload中指定Java Native函数与C实现函数的对应关系(相对的记得写解注册方法)

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
   JNIEnv* env = NULL;
   jint result = -1;
    //判断是否正确
    if(vm->GetEnv((void**)&env,JNI_VERSION_1_6)!= JNI_OK){
     	 return result;  
    }
    // 定义函数映射关系(参数1:java native函数,参数2:函数描述符,参数3:C函数)
    const JNINativeMethod method[]={{"add","(II)I",(void*)addNum}, 
    								{"sub","(II)I",(void*)subNum},
    								{"mul","(II)I",(void*)mulNum},
    								{"div","(II)I",(void*)divNum}
    							   };
    //找到对应的JNITools类   
    jclass jClassName=env->FindClass("com/example/testnative/MainActivity");
     //开始注册
     jint ret = env->RegisterNatives(jClassName,method, 4);
     //如果注册失败,打印日志
     if (ret != JNI_OK) {
  		return -1;
  	 } 
  return JNI_VERSION_1_6;
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值