Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 即使GetPrimitiveArrayCritical失败,我是否应该始终调用ReleasePrimitiveArrayCritical?_Java_Java Native Interface - Fatal编程技术网

Java 即使GetPrimitiveArrayCritical失败,我是否应该始终调用ReleasePrimitiveArrayCritical?

Java 即使GetPrimitiveArrayCritical失败,我是否应该始终调用ReleasePrimitiveArrayCritical?,java,java-native-interface,Java,Java Native Interface,我想从JNI代码访问char[],如果可能的话,避免复制。现在,我要做的是: void my_function(JNIEnv *env, jcharArray array) { jsize len = env->GetArrayLength(array); if (env->ExceptionCheck() == JNI_TRUE) return; jchar *chars = env->GetPrimitiveArrayCritica

我想从JNI代码访问char[],如果可能的话,避免复制。现在,我要做的是:

void my_function(JNIEnv *env, jcharArray array) {
    jsize len = env->GetArrayLength(array);
    if (env->ExceptionCheck() == JNI_TRUE)
        return;

    jchar *chars = env->GetPrimitiveArrayCritical(array);

    // process chars and len

    env->ReleasePrimitiveArrayCritical(array, chars, JNI_ABORT);
}
根据,当“抛出”OOM异常时,
GetPrimitiveArrayCritical
可能返回
NULL
。但是,它们没有明确说明在这种情况下是否仍应调用
ReleasePrimitiveArrayCritical

我该怎么办

jchar *chars = env->GetPrimitiveArrayCritical(array);
if (chars == NULL)
    return;


我对文档的理解是,如果你没有得到你的“chars”,就没有什么可以发布的。通过调用release,您不会释放“数组”,而是释放与数组关联的元素。如有必要,它会释放“字符”(仅当它是副本时)

如果您是“阵列”的所有者,则需要释放“阵列”。在这种情况下: {code}

此外,我还发现了这个示例生产代码,它仅在返回的指针不为null时显式调用ReleasePrimitiveArrayCritical


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

看看,调用
ReleasePrimitiveArrayCritical
似乎是解锁在
GetPrimitiveArrayCritical
调用中锁定的GC(
GC\u locker::unlock\u critical
)所必需的

似乎java数组和本机数组参数也被忽略,
GetPrimitiveArrayCritical
无论如何都不会返回NULL

但这仅对openjdk 7有效

jchar *chars = env->GetPrimitiveArrayCritical(array);
if (chars != NULL) {
    // process chars
}
env->ReleasePrimitiveArrayCritical(array, chars, JNI_ABORT);
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);