为了避免将byte []转换为String的开销,我将byte []从Java传递给本机调用。我使用GetByteArrayElements来访问jbyte指针并将其转换为(char *)。有时,我看到使用这种方法打印的一些非ASCII字符。
在研究了这个之后,我明白如果java byte []没有以null结尾,就会发生这种情况。
问题 -
在交易时从JNI中提取字符的最佳方法是什么 用字节[]?
在java方面,如果我转换byte [] - >字符串 - > byte [],会在末尾添加一个空字符吗?
答案 0 :(得分:1)
当你从字符串创建字节数组时,你会保留一些内存。您可以直接传递字符串并节省内存。
将String(C ++中的jstring)转换为char *的JNIEXPORT jstring JNICALL Java_your_package_structure_className_myMethod(JNIEnv* env, jobject jobj, jstring str) {
char* native_string = env->GetStringUTFChars(env, str, JNI_FALSE);
const char* hello = "hello ";
char* hello_prefix = new char[6 + strlen(native_string)];
strcpy(hello_prefix, hello);
strcat(hello_prefix, native_string);
/*
call
env->ReleaseStringUTFChars(env, str, native_string);
if env->GetStringUTFChars(env, str, JNI_TRUE) was executed
*/
jstring result = env->NewStringUTF(env, hello_prefix);
delete[] hello_prefix;
return result;
}
const char * GetStringUTFChars(JNIEnv * env,jstring string, jboolean * isCopy);
返回一个指向字节数组的指针,该字节数组表示修改后的UTF-8编码中的字符串。此数组在ReleaseStringUTFChars()释放之前有效。 如果isCopy不为NULL,则如果进行了复制,则* isCopy设置为JNI_TRUE;如果没有复制,则设置为JNI_FALSE。
在使用基本类型时,可以使用快速关键本机函数来减少Java转换的开销。有关详细信息,请查看this post。