在JNI中将v8 :: String转换为jstring的最快方法是什么?

时间:2013-06-07 07:00:01

标签: java android performance java-native-interface v8

我想在转换过程中避免字符串转换。因为它很慢。我建议内部V8 String和Java jstring是相同的宽字符序列,所以也许可以不使用de / encoding进行复制,甚至可以避免完全复制?

v8::String::Value v8_text(args[1]); // get the v8 string from arguments
wchar_t* w_chars = (wchar_t*)(*v8_text);
jstring j_text = (Env)->NewString((jchar*)w_chars, v8_text.length());

以上是最有效的方法吗?

比你

1 个答案:

答案 0 :(得分:0)

考虑到一些假设,你是对的。

Java字符串是Unicode字符的UTF-16编码的计数代码单元序列。字节序旨在匹配操作系统的默认值。

JavaScript字符串是16-bit unsigned integers的计数序列。

除非您调用执行此操作的函数(即ASCII或UTF-8),否则V8不会转换字符串的数据。

因此,如果您的输入实际上是带有具有预期字节序的UTF-16编码的Unicode字符串,那么您提供的代码将起作用并且应该是最有效的。

然而,

wchar_t* w_chars = (wchar_t*)(*v8_text);

有点误导,因为wchar_t具有依赖于实现的大小。最后,您只想将指针转换为jchar *,因此,如果需要执行此步骤,我建议char16_t *uint16_t *,因为它们表示假设数据的结构为2字节带有字节序的块。