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