我目前正在研究我的一个项目,它将大量使用JNI,JNI对我来说很新......我正在阅读很多内容,我有一个问题:在一个本机函数中,我想要返回一个整数,这是操作的状态,如果我无法使用GetStringUTFChars()分配字符串,我想返回一个特定的错误代码。
但我有两份文件似乎不同意:
http://java.sun.com/docs/books/jni/html/objtypes.html,第3.2.1节,说这个函数在失败时抛出OOM;
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html并没有这样说(我之所以这么说是因为此页面上的其他函数会抛出OOM)。
我倾向于相信第二个文档,因为它更新。我被误导了吗?
答案 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肯定会崩溃,呵呵。