首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持在JNI C++中添加/删除java对象

支持在JNI C++中添加/删除java对象
EN

Stack Overflow用户
提问于 2014-08-05 04:11:57
回答 1查看 266关注 0票数 0

在我的addObject(object)removeObject(object)的JNI代码中有一个模式,我需要在C/C++映射中添加一些东西,并使用这些方法删除它。

我已经有了阅读关于JNI内存管理的android文章,它说您不应该期望对JNI的调用会将相同的jobject引用返回给同一个对象的JNI方法。

到目前为止,对于添加/删除,我的JNI如下所示:

代码语言:javascript
复制
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;
}

执行此操作的最佳方法是什么?或者仅仅是这样:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++对象; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25131064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档