Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)

转载请声明:原文转自: http://www.cnblogs.com/xiezie/p/5930503.html 

Android JNI之JAVA与C++对象建立对称关联

1.JAVA对象持有C++对象的指针

  1. 在JAVA类中创建一个int类型的变量(如int mObj),用于储存C++对象的指针
  2. 在创建C++对象(如MyCPlusObj)的本地方法中,将C++对象的指针存入JAVA变量中(mObj)
复制代码
JNIEXPORT void JNICALL 
Java_nativeMethod
(JNIEnv *env, jobject thiz) {
    MyCPlusObj *obj = new MyCPlusObj();
    jclass clazz = (jclass)(*env).GetObjectClass(thiz);
    jfieldID fid = (jfieldID)(*env).GetFieldID(clazz, "mObj", "I");
    (*env).SetIntField(thiz, fid, (jint)obj);
}
复制代码
  • 如果要取得C++对象,则通过mObj的获取C++对象的指针
    jclass objClazz = (jclass)env->GetObjectClass(obj);//obj为对应的JAVA对象
    jfieldID fid = env->GetFieldID(objClazz, "mObj", "I");
    jlong p = (jlong)env->GetObjectField(obj, fid);
    MyCPlusObj *cPlusObj = (MyCPlusObj *)p;
    //cPlusObj 为JAVA对象对应的C++对象

 

2.C++对象持有JAVA对象的引用

  1. 在C++类中创建一个jint类型的变量(如jint mObj),用于储存JAVA对象的引用
  2. 在创建C++对象时,储存JAVA对象的引用
    jobject gThiz = (jobject)env->NewGlobalRef(thiz);//thiz为JAVA对象
    (*obj).javaObj = (jint)gThiz;

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JNIJava Native Interface)是一种技术,它可以让Java程序与C(或C++)程序进行互相调用。 在JNI中,我们可以使用Java的native关键字声明一个方法,该方法的具体实现在C(或C++)语言中完成。然后,我们可以通过JNI提供的接口函数,在Java和C(或C++)之间进行数据和方法的传递。 在Java代码中,我们首先需要使用System.loadLibrary()方法加载C(或C++)动态链接库。然后,通过Java的native方法调用C(或C++)中的函数,实现Java与C(或C++)的互相调用。 在C(或C++)代码中,我们需要编写与Java声明的native方法对应的具体实现代码。可以使用JNI提供的接口函数,通过JNIEnv结构体来访问Java对象、方法和属性。 Java与C(或C++)之间的数据传递可以通过JNI提供的接口函数来完成。我们可以使用JNI的函数将Java的基本数据类型与C(或C++)的对应类型进行转换,例如将int转换为jint、jint转换为int等等。同时,我们也可以使用JNI函数来处理复杂的数据结构,例如将Java的字符串转换为C(或C++)的字符串,或将Java的数组转换为C(或C++)中的数组。 在实际应用中,JNI可以用于优化性能,因为C(或C++)代码相对于Java代码可以更高效地执行某些操作。同时,JNI也可以用于与现有的C(或C++)库进行集成,以利用已有的功能。 总之,JNI提供了一种机制,可以在Java和C(或C++)之间实现互相调用,使得我们可以充分利用两者各自的优势,在应用开发中更加灵活和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值