java - isCopy 字段在 android 中总是必需的吗?

标签 java android c++ java-native-interface

我通常处理来自 java 的字符串的 JNI 代码是这样的:

jboolean isCopy_something;

const char* something=env->GetStringUTFChars(somethingFromJava,&isCopy_something);

if(isCopy_something==JNI_TRUE){
    env->ReleaseStringUTFChars(somethingFromJava,something);
}

我认为如果我需要一个额外的 jboolean 用于 Java 中的每个字符串,它会严重影响代码的可读性,除了 jboolean,我还需要一个 if else 语句来包装 ReleaseStringUTFChars。

我记得我看到一些代码只传递 NULL 而不是 isCopy 的地址。

我可以在不检查 isCopy 的情况下调用 ReleaseStringUTFChars 吗?

查了一些关于isCopy字段的帖子,还是不太明白ReleaseStringUTFChars中isCopy字段的作用:isCopy什么时候变成JNI_TRUE,什么时候变成JNI_FALSE?它取决于平台吗?还是取决于运行时条件?还是其他条件?

最佳答案

正如@tom-blodget 所说,如果结果不是NULL<,您应该始终GetStringUTFChars 之后调用ReleaseStringUTFChars/.

isCopy 只允许您应用优化:

  • 如果 isCopytrue,您可以安全地修改返回的缓冲区,而不用担心 Java 端的 String 受到影响。
  • 如果isCopyfalse,则如果需要修改,则必须分配另一个缓冲区并进行复制。请不要直接修改返回的缓冲区!这是因为在 Java 中,String 类型是不可变的。所有 Java 代码都期望 String 对象永远不会改变。

关于java - isCopy 字段在 android 中总是必需的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992989/

相关文章:

Java:JTable 重新排序行并刷新

java - 为什么 Java(Android?)将我文件的最后修改日期设置为明天?

android - 升级后 CameraX 预览不起作用

c++ - 我创建的 c++ istream 对象和 cin 之间的区别在哪里,它在库中的何处可见

java - 从 tomcat 访问 jar 文件

java - google 的 ImmutableList 和 Collections.unmodifiableList() 有什么区别?

Android 键盘无法关闭

android - 照片捕获 Intent 仅在三星手机上导致 NullPointerException

c++ - 关于学习 Xlib ("the Linux Petzold"的书籍/资源?)

c++ - 如何在 gdb 中为 pretty-print 调用构造函数