Java 环境上的JNI崩溃->;有时是新对象?
我正在尝试用C创建一个对象,并将其传递给jvm java对象如下所示:Java 环境上的JNI崩溃->;有时是新对象?,java,java-native-interface,Java,Java Native Interface,我正在尝试用C创建一个对象,并将其传递给jvm java对象如下所示: package mypackage; public class Blub { public Blub(float a, float b) { // storing the floats } } C端初始化为: jclass Blub_class = env->FindClass("mypackage/Blub"); jmethodID Blub_constructor = env->GetMet
package mypackage;
public class Blub {
public Blub(float a, float b) {
// storing the floats
}
}
C端初始化为:
jclass Blub_class = env->FindClass("mypackage/Blub");
jmethodID Blub_constructor = env->GetMethodID(Blub_class, "<init>", "(FF)V");
在这里,它大多数时候都失败了——有时成功了。。?
这真的很奇怪——如果它在整个程序运行中都能正常工作,如果它不能正常工作,那么在第一次执行NewObject时就会失败
其他一些信息:
- NewObject调用线程连接到jvm
- env是线程对jvm的本地引用
- Blub_类和Blub_构造函数由另一个线程获取和存储
- 初始化线程被保证在调用NewObject之前以初始化方式进行初始化
- 在调试器中,NewObject的每个参数似乎都正常
V [jvm.dll+0x14a6a6]
C [mylib.dll+0x1fae9] JNIEnv_::NewObject+0x59
问题是另一个线程存储的
jclass
。该对象引用可能会过时。您不能像这样在JNI调用中保留对象引用NOE:请参阅文档。在同一个线程中编写上述代码,否则会浪费内存并使用GlobalRef
。问题在于另一个线程存储的jclass
。该对象引用可能会过时。您不能像这样在JNI调用中保留对象引用NOE:请参阅文档。在同一线程中编写上述代码,否则会浪费内存并使用GlobalRef
。
V [jvm.dll+0x14a6a6]
C [mylib.dll+0x1fae9] JNIEnv_::NewObject+0x59