为了避免将byte[]转换为string的开销,我将byte[]从java传递到本机调用。我使用getbytearrayelements访问jbyte指针并将其转换为(char*)。有时,我看到一些非ascii字符打印使用这种方法。
经过研究,我了解到如果java byte[]不是以null结尾的,可能会发生这种情况。
问题-
处理字节[]时,从jni中提取字符的最佳方法是什么?
在java方面,如果我转换byte[]->string->byte[],会在末尾添加一个空字符吗?
为了避免将byte[]转换为string的开销,我将byte[]从java传递到本机调用。我使用getbytearrayelements访问jbyte指针并将其转换为(char*)。有时,我看到一些非ascii字符打印使用这种方法。
经过研究,我了解到如果java byte[]不是以null结尾的,可能会发生这种情况。
问题-
处理字节[]时,从jni中提取字符的最佳方法是什么?
在java方面,如果我转换byte[]->string->byte[],会在末尾添加一个空字符吗?
1条答案
按热度按时间py49o6xq1#
当您从字符串创建字节数组时,您持有一些内存。您可以直接传递字符串并节省内存。
将字符串(c++中的jstring)转换为char*的正确方法是:
const chargetstringutfchars(jnienvenv,jstring string,jboolean*iscopy);
返回一个指针,该指针指向一个字节数组,该数组表示采用修改的utf-8编码的字符串。此数组在被releasestringutfchars()释放之前是有效的。如果iscopy不为空,那么如果复制,*iscopy设置为jni\u true;如果没有复制,则设置为jni\ U false。
挑剔的本地人
在处理基元类型时,可以使用快速关键的本机函数来减少java转换的开销。详情请看这篇文章。