GetStringUTFChars及其字符串复制行为 在GETString UTFUCSASH()中,它将java字符串 JString > C++ >代码> const char */COD>,返回一个可选的 jBooLoe< /Cult>标志,指示它在函数调用中是否执行复制。但是,该文档没有提到GetStringUTFChars()何时将执行或不执行复制。我的问题是: GetStringUTFChars()将在哪种情况下执行复制 有没有办法避免在GetStringUTFChars()中复制 如果回答问题2。是真的,是否建议避免此类复制

GetStringUTFChars及其字符串复制行为 在GETString UTFUCSASH()中,它将java字符串 JString > C++ >代码> const char */COD>,返回一个可选的 jBooLoe< /Cult>标志,指示它在函数调用中是否执行复制。但是,该文档没有提到GetStringUTFChars()何时将执行或不执行复制。我的问题是: GetStringUTFChars()将在哪种情况下执行复制 有没有办法避免在GetStringUTFChars()中复制 如果回答问题2。是真的,是否建议避免此类复制,java,c++,string,optimization,java-native-interface,Java,C++,String,Optimization,Java Native Interface,根据《基本JNI Java本机接口》一书,决定是否复制的是JVM的实现。因此,不,您无法控制复制。根据《基本JNI Java本机接口》一书,决定复制是否完成的是JVM的实现。因此,不,您无法控制复制。是否复制字符串始终取决于JVM实现,但您可以通过使用GetStringCritical而不是GetStringUTFChars来降低复制的可能性。但请注意,GetStringCritical返回UTF-16编码字符串(与GetStringUTFChars返回的UTF-8编码字符串相反),因此您可能需

根据《基本JNI Java本机接口》一书,决定是否复制的是JVM的实现。因此,不,您无法控制复制。

根据《基本JNI Java本机接口》一书,决定复制是否完成的是JVM的实现。因此,不,您无法控制复制。

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

根据我的经验(操作系统10.11上的Oracle 1.8.0_51-b16),
GetStringUTFChars
总是返回副本,而
GetStringCritical
从不返回副本,这并不奇怪,因为Java在内部将字符串存储为UTF-16,因此提取UTF-8可能需要制作数据的副本


请参阅:

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

根据我的经验(操作系统10.11上的Oracle 1.8.0_51-b16),
GetStringUTFChars
总是返回副本,而
GetStringCritical
从不返回副本,这并不奇怪,因为Java在内部将字符串存储为UTF-16,因此提取UTF-8可能需要制作数据的副本


请参阅:

非常感谢您的回答:)+1的宝贵报价!你推荐那本书好吗?我推荐。作者是“Rob Gordon”。@PaulMcKenzie看到了吗:谢谢你提供的信息。Oracle网页已经过期,这就是原因。诚然,在我看来,在JNI上找到好的文档越来越难了,有点像是一门“失传的艺术”。因此,除非你在做某种分析,否则传递
NULL
。很难理解为什么JVM会有一个“修改过的UTF-8”版本的字符串挂在周围,它除了JNI没有其他用途,即使在那里,它的适用性也是似是而非的。我假设如果您多次对同一字符串或同一字符串值调用
GetStringUTFChars
,JVM可能知道它尚未覆盖转换缓冲区(内部字符串为UTF-16)。该问题更适用于
GetStringChars
(标准UTF-16)。也许签名只是为了遵循相同的模式。非常感谢您的回答:)+1的宝贵报价!你推荐那本书好吗?我推荐。作者是“Rob Gordon”。@PaulMcKenzie看到了吗:谢谢你提供的信息。Oracle网页已经过期,这就是原因。诚然,在我看来,在JNI上找到好的文档越来越难了,有点像是一门“失传的艺术”。因此,除非你在做某种分析,否则传递
NULL
。很难理解为什么JVM会有一个“修改过的UTF-8”版本的字符串挂在周围,它除了JNI没有其他用途,即使在那里,它的适用性也是似是而非的。我假设如果您多次对同一字符串或同一字符串值调用
GetStringUTFChars
,JVM可能知道它尚未覆盖转换缓冲区(内部字符串为UTF-16)。该问题更适用于
GetStringChars
(标准UTF-16)。也许签名只是为了遵循相同的模式。这是离题的,但如果要使用
GetStringUTFChars
,请务必理解“修改的UTF-8”。返回值是该函数接口契约中更重要的部分。这是离题的,但如果要使用
GetStringUTFChars
,请务必理解“修改的UTF-8”。返回值是该函数接口契约中更重要的部分。