支持在JNI C+中添加/删除java对象+;
我的JNI代码中有一个模式,支持在JNI C+中添加/删除java对象+;,java,c++,c,android-ndk,java-native-interface,Java,C++,C,Android Ndk,Java Native Interface,我的JNI代码中有一个模式,addObject(object)和removeObject(object)我需要在C/C++映射中添加一些东西,并使用这些方法将其删除 我已经说过了,它说您不应该期望对JNI的调用返回对同一对象的JNI方法的相同jobject引用 到目前为止,对于添加/删除,我的JNI如下所示: JNIEXPORT void JNICALL Java_com_nicholas_MyClass_addObject(JNIEnv *jenv, jobject thisObject, j
addObject(object)
和removeObject(object)
我需要在C/C++映射中添加一些东西,并使用这些方法将其删除
我已经说过了,它说您不应该期望对JNI的调用返回对同一对象的JNI方法的相同jobject
引用
到目前为止,对于添加/删除,我的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;
}
我不确定deviceListenerMap的类型是什么,但如果可能,我会使用Java对象返回的hashCode()将其存储在映射中。确保你对“某些C++对象”的<强> >复制< /强>,ObjuttoAdad有适合你需要的正确。 JNIEXPORT void JNICALL Java_com_nicholas_MyClass_addObject(JNIEnv*jenv,jobject thisObject,jobject objectToAdd){ jclass classToAdd=GetObjectClass(jenv jobject objectToAdd) jmethodID=GetMethodID(env,classToAdd,“hashCode”,V)I) jint val=CallIntMethod(env,objectToAdd,id)
DeVeleListNeVMAP[VAL]=//某些C++对象;
}这真是个好主意。非常感谢。