即使GetPrimitiveArrayCritical失败,我是否应该总是调用ReleasePrimitiveArrayCritical?

时间:2016-03-19 12:45:50

标签: java java-native-interface

我想从JNI代码访问char [],尽可能避免复制。现在,这就是我的工作:

GetPrimitiveArrayCritical

根据JNI documentationNULL可能会在“抛出”OOM异常时返回ReleasePrimitiveArrayCritical。但是,他们没有明确说明在这种情况下是否应该仍然调用jchar *chars = env->GetPrimitiveArrayCritical(array); if (chars == NULL) return;

我应该

jchar *chars = env->GetPrimitiveArrayCritical(array);
if (chars != NULL) {
    // process chars
}
env->ReleasePrimitiveArrayCritical(array, chars, JNI_ABORT);

public interface INotifier<T,G>{
   G getNotifications(){
    //does something   
    }
}

3 个答案:

答案 0 :(得分:0)

我对文档的理解是,如果你没有得到你的#34;字符,就没有什么可以释放的。通过调用release,您不会释放您的&#34;数组&#34;,只是与数组关联的元素。它释放了#chars&#34;如有必要(仅限副本)

发布&#34;阵列&#34;如果您是它的所有者,则是必要的。在这种情况下: {代码}

int len = 10;
jcharArray array = env->NewCharArray(len);
if (!array) return;
jchar* chars = env->GetCharArrayElements(array, NULL);
if (!chars) { env->DeleteLocalRef(array); return; }
{... do something...}
env->ReleaseCharArrayElements(array, chars, JNI_ABORT);
env->DeleteLocalRef(array);

另外,我发现这个生产代码示例只有在返回的指针不为null时才显式调用ReleasePrimitiveArrayCritical。

https://code.google.com/p/chromium/codesearch#chromium/src/third_party/libjpeg_turbo/turbojpeg-jni.c&q=GetPrimitiveArrayCritical&sq=package:chromium&l=365

答案 1 :(得分:0)

ReleasePrimitiveArrayCritical(…, NULL, …)将失败。但我必须承认,我从未经历过GetPrimitiveArrayCritical()返回NULL。很遗憾没有办法有条件地要求字节,即没有JNI函数GetPrimitiveArrayCriticalNoCopyOrFail()

答案 2 :(得分:0)

查看openjdk code,似乎需要调用ReleasePrimitiveArrayCritical来解锁GC_locker::unlock_critical来电中锁定的GC(GetPrimitiveArrayCritical)。

似乎还忽略了java数组和本机数组参数,并且GetPrimitiveArrayCritical永远不会返回NULL。

这仅适用于openjdk 7.