Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 环境上的JNI崩溃->;有时是新对象?_Java_Java Native Interface - Fatal编程技术网

Java 环境上的JNI崩溃->;有时是新对象?

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

我正在尝试用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->GetMethodID(Blub_class, "<init>", "(FF)V");
在这里,它大多数时候都失败了——有时成功了。。? 这真的很奇怪——如果它在整个程序运行中都能正常工作,如果它不能正常工作,那么在第一次执行NewObject时就会失败

其他一些信息:

  • NewObject调用线程连接到jvm
  • env是线程对jvm的本地引用
  • Blub_类和Blub_构造函数由另一个线程获取和存储
  • 初始化线程被保证在调用NewObject之前以初始化方式进行初始化
  • 在调试器中,NewObject的每个参数似乎都正常
目前,我正在通过在jvm上只使用原始参数调用方法来解决这个问题,这很好

我真的不知道我错过了什么-我做的有什么不对吗

此外,以下是它失败的原因:

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