我可以安全删除jmethodID和jFieldID吗?

时间:2018-08-09 06:58:04

标签: java-native-interface

我有一些Java / JNI代码,必须在两种不同的环境中进行编译:

  • 使用OpenJDK / GCC的标准环境;
  • 使用JamaicaVM(旧版本)/ Sparc-GCC的嵌入式环境。

在我坚持使用的JamaicaVM版本中,JNI的实现并不完全符合标准,特别是返回jmethodID / jFieldID s的函数返回本地引用。

我可以使用DeleteLocalRef释放ID,但是我想知道这是否会在符合JNI环境的情况下引发问题?以下安全吗?

jmethodID myMethod = env->GetMethodID(...);
// Do stuff with myMethod
env->DeleteLocalRef(myMethod);

2 个答案:

答案 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}},类型jmethodIDjfieldID是常规C指针类型。因此,这些类型的变量不应传递给DeleteLocalRef()

注意::使用OpenJDK执行代码段并传递选项-Xcheck:jni时,您应该会看到警告甚至是致命错误。