我有本机方法返回目录中的文件数组。 public static native char [] [] scan(String path); 我无法返回字符串数组,因为如果文件编码无效 - 一切都崩溃了 问题是在java端正确地将char []转换为String,当我尝试新的String(chars);我得到不可打印的字符串(无效)。请纠正我。
以下是输出示例(If方法返回String [])
Array.toString(scan("/storage/"));
- > [/ storage / sdcard1,/ storage / sdcard0]
这是方法返回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;
}
答案 0 :(得分:2)
您不能在非MUTF8字符串上使用NewStringUTF
(其中MUTF8是&#34;修改后的UTF-8&#34;由JNI规范定义)。
您需要在本机代码中将本地字符集转换为UTF-16,然后使用NewString
,或将byte[]
数组传递到Java代码中,然后使用String constructor that takes a charset论点。要使用的Charset取决于您的文件系统支持的内容。
现在您要么将非MUTF8数据放入NewStringUTF
,如果启用了CheckJNI,则会失败,或者您在不执行字符集的情况下将字节值放入UTF-16字符中转换。