我想从JNI代码访问char [],尽可能避免复制。现在,这就是我的工作:
GetPrimitiveArrayCritical
根据JNI documentation,NULL
可能会在“抛出”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
}
}
答案 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。
答案 1 :(得分:0)
ReleasePrimitiveArrayCritical(…, NULL, …)
将失败。但我必须承认,我从未经历过GetPrimitiveArrayCritical()
返回NULL。很遗憾没有办法有条件地要求字节,即没有JNI函数GetPrimitiveArrayCriticalNoCopyOrFail()
!
答案 2 :(得分:0)
查看openjdk code,似乎需要调用ReleasePrimitiveArrayCritical
来解锁GC_locker::unlock_critical
来电中锁定的GC(GetPrimitiveArrayCritical
)。
似乎还忽略了java数组和本机数组参数,并且GetPrimitiveArrayCritical
永远不会返回NULL。
这仅适用于openjdk 7.