gpt4 book ai didi

java - 使用正确的编码 jni 将 jcharArray 转换为 String

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:19 25 4
gpt4 key购买 nike

我有返回目录中文件数组的 native 方法。public static native char[][] 扫描(字符串路径);我无法返回字符串数组,因为如果文件的编码无效 - 一切都会崩溃问题是当我尝试 new String(chars); 时,在 Java 端将 char[] 正确转换为 String;我得到不可打印的字符串(无效)。请指正。

这是输出示例(如果方法返回 String[])

Array.toString(scan("/storage/")); -> [/storage/sdcard1,/storage/sdcard0]

这里是 if 方法 return char[][];

char[][] chars = scan("/storage/");
String[] stringArray = new String[char.length];
for(int i = 0; i < chars.length; i++){
stringArray[i] = new String(char[i]);
}
Arrays.toString(stringArray); -> //unprintable symbols [����������爀条⽥摳慣摲쉮R����,����������爀条⽥摳慣摲쉮R����]

C 端发生了什么:if 方法返回 String[]

jobjectArray scan(JNIEnv *env, jclass cls,jstring jpath){
std::vector<std::string> data;//contains some strings
unsigned int size = data.size();
jobjectArray ret = env->NewObjectArray(size,env->FindClass("java/lang/String"),NULL);
for (unsigned int i = 0; i < size; i++){
env->SetObjectArrayElement(ret,i,env->NewStringUTF(data.at(i).c_str()));
}
return ret;
}

C 端发生了什么:if 方法返回 char[][];

jobjectArray scan(JNIEnv *env, jclass cls,jstring jpath){
std::vector<std::string> data;//contains some strings
unsigned int size = data.size();
jobjectArray ret = env->NewObjectArray(size, env->FindClass("[C"), NULL);
for (unsigned int i = 0; i < size; i++){
env->SetObjectArrayElement(ret,i,env->NewStringUTF(toChar(env,data.at(i))));
}
return ret;
}
jcharArray toChar(JNIEnv *env, string string) {
unsigned int n=0;
const char* p = string.c_str();
while(*p++){
n++;
} if(n<=0)
return NULL;

jcharArray arr = env->NewCharArray(n);
env->SetCharArrayRegion(arr,0,n, (jchar*)p);
return arr;
}

最佳答案

您不能在非 MUTF8 字符串上使用 NewStringUTF(其中 MUTF8 是由 JNI 规范定义的“修改后的 UTF-8”)。

您要么需要在 native 代码中将本地字符集转换为 UTF-16,然后使用 NewString,要么将 byte[] 数组传递到您的 Java 代码中,然后然后使用 String constructor that takes a charset争论。要使用的字符集取决于您的文件系统支持什么。

现在您要么将非 MUTF8 数据放入 NewStringUTF,如果启用 CheckJNI,这将失败,或者您将字节值放入 UTF-16 字符而不进行字符集转换.

关于java - 使用正确的编码 jni 将 jcharArray 转换为 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24510117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com