Android JNI之JAVA與C++對象建立對稱關聯

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;

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章