在我的addObject(object)和removeObject(object)的JNI代码中有一个模式,我需要在C/C++映射中添加一些东西,并使用这些方法删除它。
我已经有了阅读关于JNI内存管理的android文章,它说您不应该期望对JNI的调用会将相同的jobject引用返回给同一个对象的JNI方法。
到目前为止,对于添加/删除,我的JNI如下所示:
JNIEXPORT void JNICALL Java_com_nicholas_MyClass_addObject(JNIEnv *jenv, jobject thisObject, jobject objectToAdd) {
jobject newJavaObject = jenv->NewGlobalRef(objectToAdd);
stdMap[newJavaObject] = //Some C++ Object;
}
JNIEXPORT void JNICALL Java_com_nicholas_MyClass_removeObject(JNIEnv *jenv, jobject thisObject, jobject objectToRemove) {
jobject newJavaObject = jenv->NewGlobalRef(objectToAdd);
stdMap[newJavaObject] = NULL;
}执行此操作的最佳方法是什么?或者仅仅是这样:
JNIEXPORT void JNICALL Java_com_nicholas_MyClass_addObject(JNIEnv *jenv, jobject thisObject, jobject objectToAdd) {
deviceListenerMap[objectToAdd] = //Some C++ Object;
}
JNIEXPORT void JNICALL Java_com_nicholas_MyClass_removeObject(JNIEnv *jenv, jobject thisObject, jobject objectToRemove) {
deviceListenerMap[objectToRemove] = NULL;
}发布于 2014-08-05 18:28:03
我不太清楚deviceListenerMap的类型是什么,但如果可能的话,我会使用hashCode对象返回的hashCode()将其存储在映射中。确保将所有值复制到“SomeSomeC++对象”,并确保objectToAdd具有适合您需要的正确的hashCode和equals方法重写。
JNIEXPORT void Java_com_nicholas_MyClass_addObject(JNIEnv*jenv,jobject thisObject,jobject objectToAdd) { jclass classToAdd =GetObjectClass( jobject ); jmethodID id = GetMethodID(env,classToAdd,"hashCode","(V)I"); jint = CallIntMethod(env,objectToAdd,id); deviceListenerMapval =//某个C++对象; }
https://stackoverflow.com/questions/25131064
复制相似问题