1

在我们拥有的一些 JNI 代码中,我们调用GetStringCritical()以获取字符串的内容。之后,我们调用ExceptionCheck()以处理发生的任何异常。

我正在运行代码-Xcheck:jni,我得到了很多......

Warning: Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical

...这是由调用引起的ExceptionCheck()(通过单步执行代码确定)。

由此,我假设GetStringCritical()不会导致异常是否正确?

4

2 回答 2

2

按照文档到实际包含有关GetStringCritical函数的真实信息的多个主题,您会发现:

在临界区内,本机代码不得调用其他 JNI 函数

返回指向 Unicode 字符串的指针,如果操作失败,则返回 NULL。

所以,不,它不会导致异常,并且警告与文档一致:不要调用other JNI functions.

调用GetStringCritical使您可以短期访问字符串中的字符,以便您可以通过C函数使用或复制它们。

于 2013-04-29T22:56:44.200 回答
0

我有同样的问题。主要原因是在你使用getstringprimitive/getprimitivearray 之后,你必须调用releaseprimitive。如果没有,当您对同一个 java 对象进行多次调用时,它会告诉您您已经为一个对象打开了一个会话,并且您尝试在另一个函数调用中使用它。

例如:

Func1(..){
env->GetStringCritical(..)
env->ReleaseStringCritical(..)
}

Func2(..){
env->GetStringCritical(..)
}

当您不释放其中一个时,它会发出警告。只需将 release 也发布到 Func2 并摆脱该问题。

于 2014-09-10T12:18:04.003 回答