JNI:GetStringUTFChars()是否会在失败时抛出OOM?

时间:2011-12-12 10:48:49

标签: java-native-interface out-of-memory

我目前正在研究我的一个项目,它将大量使用JNI,JNI对我来说很新......我正在阅读很多内容,我有一个问题:在一个本机函数中,我想要返回一个整数,这是操作的状态,如果我无法使用GetStringUTFChars()分配字符串,我想返回一个特定的错误代码。

但我有两份文件似乎不同意:

我倾向于相信第二个文档,因为它更新。我被误导了吗?

2 个答案:

答案 0 :(得分:2)

我认为这两套文件是一致的(至少我现在正在看的版本)。

来自http://java.sun.com/docs/books/jni/html/objtypes.html

  

不要忘记检查GetStringUTFChars的返回值。由于Java虚拟机实现需要分配内存来保存UTF-8字符串,因此内存分配可能会失败。发生这种情况时,GetStringUTFChars返回NULL并抛出OutOfMemoryError异常。正如我们将在第6章中学到的,通过JNI抛出异常与在Java编程语言中抛出异常不同。通过JNI抛出的挂起异常不会自动更改本机C代码中的控制流。相反,我们需要发出一个显式的return语句,以跳过C函数中的其余语句。返回Java_Prompt_getLine之后,将在Prompt.main中调用异常,Prompt.getLine本机方法的调用者。

来自http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

  

返回值:

     

返回指向修改后的UTF-8字符串的指针,如果操作失败,则返回NULL。

因此两者都声明NULL在失败时返回,但第一个更进一步说明一旦JNI C ++函数返回,将在Java层中抛出异常。

答案 1 :(得分:0)

好吧,好吧,在玩了ulimits之后,为了触发本机故障,由于无法使用malloc()获取GetStringUTFChars()而导致JVM崩溃:/

我想我只是假设它在失败时返回NULL并完成它,虽然我非常怀疑这种情况会发生 - JVM肯定会崩溃,呵呵。