GetStringUTFChars及其字符串复制行为

时间:2014-03-22 04:50:30

标签: java c++ string optimization java-native-interface

JNI document中,将java字符串jstring转换为c ++ const char*的GetStringUTFChars()将返回一个可选的jboolean标志,指示它是否执行复制在函数调用中。但是,该文档未提及GetStringUTFChars()何时执行或不执行复制。我的问题是:

  1. GetStringUTFChars()在哪个条件下执行副本?
  2. 有没有办法避免在GetStringUTFChars()中复制?
  3. 如果问题2的答案是真的,是否建议避免这样的副本?

2 个答案:

答案 0 :(得分:3)

根据“Essential JNI Java Native Interface”一书,JVM的实现决定了副本是否完成。所以不,你无法控制复制。

答案 1 :(得分:2)

是否复制字符串始终取决于JVM实现,但您可以通过使用GetStringCritical而不是GetStringUTFChars来降低复制的可能性。但请注意GetStringCritical返回UTF-16编码的字符串(与GetStringUTFChars返回的UTF-8编码字符串相反),因此您可能需要转换为所需的编码。< / p>

根据我的经验(OS 10.11上的Oracle 1.8.0_51-b16),GetStringUTFChars总是返回一个副本而GetStringCritical永远不会返回副本,这并不奇怪,因为Java将Strings内部存储为UTF -16,因此提取UTF-8可能需要复制数据。

请参阅:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#GetStringCritical_ReleaseStringCritical