通过其他线程通过JNI呼叫保存的Java对象
Calling into a saved java object via JNI from a different thread
我有一个Java对象,该对象通过JNI调用C 共享对象。在C 中,我保存了对Jnienv和Jobject的引用。
JavaVM * jvm;
JNIEnv * myEnv;
jobject myobj;
JNIEXPORT void JNICALL Java_org_api_init
(JNIEnv *env, jobject jObj) {
myEnv = env;
myobj = jObj;
}
我也有一个glsurface渲染器,它最终称为上面在其他线程(glthread)上提到的C 共享对象。然后,我试图使用最初保存的Jobight回到我的原始Java对象中,但是我认为因为我在glthread上,我会收到以下错误。
W/dalvikvm(16101): JNI WARNING: 0x41ded218 is not a valid JNI reference
I/dalvikvm(16101): "GLThread 981" prio=5 tid=15 RUNNABLE
I/dalvikvm(16101): | group="main" sCount=0 dsCount=0 obj=0x41d6e220 self=0x5cb11078
I/dalvikvm(16101): | sysTid=16133 nice=0 sched=0/0 cgrp=apps handle=1555429136
I/dalvikvm(16101): | schedstat=( 0 0 0 ) utm=42 stm=32 core=1
返回Java的代码:
void setData()
{
jvm->AttachCurrentThread(&myEnv, 0);
jclass javaClass = myEnv->FindClass("com/myapp/myClass");
if(javaClass == NULL){
LOGD("ERROR - cant find class");
}
jmethodID method = myEnv->GetMethodID(javaClass, "updateDataModel", "()V");
if(method == NULL){
LOGD("ERROR - cant access method");
}
// this works, but its a new java object
//jobject myobj2 = myEnv->NewObject(javaClass, method);
//this is where the crash occurs
myEnv->CallVoidMethod(myobj, method, NULL);
}
相反,如果我使用env-> newObject创建了一个新的职位,我可以将其助理回Java,但这是一个新对象,我不想要它。我需要回到我的原始Java对象。
在我回到Java之前切换线程是一个问题吗?如果是这样,我该怎么办?
从不同线程访问对象是可以的。问题是JNI调用将对象作为本地引用。如果您想在JNI调用之间参考JNI调用之间的验证,则需要将其全局参考:
myobj = env->NewGlobalRef(jObj);
完成使用后要释放它,否则垃圾收集器不会收集它,您将获得内存泄漏:
myEnv->DeleteGlobalRef(myobj);
在此处阅读有关全局与本地参考的信息。
相关文章:
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- C++17 如何保存泛型可调用对象以供以后使用
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 将对象信息保存到二进制文件中
- C++两次从文件保存对象读取多重继承
- 有没有办法自动初始化 std::shared_ptr 来保存有效对象?
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 将抽象值对象保存在包装器中和继承的用法中
- 如何保存模板的对象阵列进行文件
- 我的共享内存对象保存在哪里
- 保存对象的攻击函数并稍后称呼它是明确定义的行为
- 如何创建一个动态数组,该数组可以保存从C++中派生的同一基类的所有不同对象
- 即使在 C++ 中的 fstream.clear() 之后,对象也没有被保存
- 如何将所有派生类对象保存在一个容器中
- Visual C++,CMap对象保存到blob列
- 将派生类的对象保存在基 c 的 std::list 中
- 使用 libpng - const 对象保存图像
- 在将图像对象保存到文件 (GDI+) 时获取 Win32Error
- 如何使用weak_ptr构造一个对象,该对象保存对父项的引用
- 将对象保存到二进制文件中的有效方法