我有一些Java / JNI代码,必须在两种不同的环境中进行编译:
在我坚持使用的JamaicaVM版本中,JNI的实现并不完全符合标准,特别是返回jmethodID
/ jFieldID
s的函数返回本地引用。
我可以使用DeleteLocalRef
释放ID,但是我想知道这是否会在符合JNI环境的情况下引发问题?以下安全吗?
jmethodID myMethod = env->GetMethodID(...);
// Do stuff with myMethod
env->DeleteLocalRef(myMethod);
答案 0 :(得分:0)
这实际上是JamaicaVM的不当行为,并由JamaicaVM 6.2.4修复。 JamaicaVM的任何最新版本的行为均符合预期。因此,不应调用DeleteLocalRef()
。
请参见http://www.aicas.com/jamaica/6.2/doc/JamaicaVM-6.2-Release-Notes.html
答案 1 :(得分:0)
在符合标准的JNI实现中,调用DeleteLocalRef()
是不安全的。根据{{3}},类型jmethodID
和jfieldID
是常规C指针类型。因此,这些类型的变量不应传递给DeleteLocalRef()
。
注意::使用OpenJDK执行代码段并传递选项-Xcheck:jni
时,您应该会看到警告甚至是致命错误。