为了尽量减少复制操作并直接访问String的字符串内容,JNI提供了GetStringCritical,它一直运行良好。然而,随着Java中“String Compact”的引入,字符串编码可以是Latin1或UTF16。在英语地区,绝大多数字符都可以使用 Latin1 表示,因此大多数 String 对象内部都使用 Latin1 存储。这在使用 GetStringCritical 时会造成尴尬的情况,因为包含的字符串将被强制转码为 UTF16,这意味着明确的复制操作。
C++端还有直接访问字符串内容的方法吗?我们真的必须求助于反射来从字符串中检索 byte[] 值吗?
如果 UTF-16 在 Java 堆方面是可接受的,您可以随时使用
-XX:-CompactStrings
禁用它。