在我们的一些JNI代码中,我们调用GetStringCritical()
来获取字符串的内容。之后,我们调用ExceptionCheck()
来处理发生的任何异常。
我正在使用-Xcheck:jni
运行代码,而且我得到了很多......
Warning: Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical
...这是由ExceptionCheck()
的调用引起的(通过代码踩踏确定)。
从这一点来看,假设GetStringCritical()
不能导致异常,我是否正确?
答案 0 :(得分:2)
关注docs个实际包含GetStringCritical
函数实际信息的多个主题后,您会发现:
在关键区域内,本机代码不得调用其他JNI 功能
和
返回指向Unicode字符串的指针,如果操作失败,则返回NULL。
所以,不,它不会导致异常并且警告与文档一致:不要调用other JNI functions
。
通过拨打GetStringCritical
,您可以短信访问字符串中的字符,以便您可以使用C
函数来复制它们。
答案 1 :(得分:0)
我有同样的问题。主要原因是在使用getstringprimitive / getprimitivearray之后,必须调用releaseprimitive。如果没有,当你有多个具有相同java对象的调用时,它会告诉你已经为一个对象打开了一个会话,并尝试在另一个函数调用中使用它。
例如:
Func1(..){
env->GetStringCritical(..)
env->ReleaseStringCritical(..)
}
Func2(..){
env->GetStringCritical(..)
}
当你不释放其中一个时,就会发出警告。只需将释放发布到Func2并解决该问题。