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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

     

以上是关于Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK开发之Jni调用Java对象

在Android上部署深度学习模型之编写JNI接口

通过 JNI (Cocos2dx) 获取 Java 对象到 C++

#yyds干货盘点#Android C++系列:JNI操作Bitmap

android源码分析之JNI调用与回调

Android JNI开发