Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将jcharArray转换为具有正确编码jni的字符串_Java_C++_C_Android Ndk_Java Native Interface - Fatal编程技术网

Java 将jcharArray转换为具有正确编码jni的字符串

Java 将jcharArray转换为具有正确编码jni的字符串,java,c++,c,android-ndk,java-native-interface,Java,C++,C,Android Ndk,Java Native Interface,我有一个本机方法返回目录中的文件数组。 公共静态本机字符[][]扫描(字符串路径); 我不能返回字符串数组,因为若文件的编码无效,所有内容都会崩溃 问题是在java端正确地将char[]转换为字符串,当我尝试新字符串(chars)时;我得到了无法打印的字符串(无效)。请纠正我 下面是输出示例(如果方法返回字符串[]) Array.toString(扫描(“/storage/”)->[/storage/sdcard1,/storage/sdcard0] 下面是if方法返回char[]] char[

我有一个本机方法返回目录中的文件数组。 公共静态本机字符[][]扫描(字符串路径); 我不能返回字符串数组,因为若文件的编码无效,所有内容都会崩溃 问题是在java端正确地将char[]转换为字符串,当我尝试新字符串(chars)时;我得到了无法打印的字符串(无效)。请纠正我

下面是输出示例(如果方法返回字符串[])

Array.toString(扫描(“/storage/”)->[/storage/sdcard1,/storage/sdcard0]

下面是if方法返回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����]
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;
    }
char[][]chars=scan(“/storage/”);
String[]stringArray=新字符串[char.length];
for(int i=0;i//无法打印的符号[����������爀条⽥摳慣摲쉮R����,����������爀条⽥摳慣摲쉮R����]
C端会发生什么:if方法返回字符串[]

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;
}
jobjectArray扫描(JNIEnv*env、jclass cls、jstring jpath){
std::vector data;//包含一些字符串
unsigned int size=data.size();
jobjectArray ret=env->NewObjectArray(大小,env->FindClass(“java/lang/String”),NULL;
for(无符号整数i=0;iSetObjectArrayElement(ret,i,env->NewStringUTF(data.at(i).c_str());
}
返回ret;
}
在C端会发生什么:if方法返回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����]
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;
    }
jobjectArray扫描(JNIEnv*env、jclass cls、jstring jpath){
std::vector data;//包含一些字符串
unsigned int size=data.size();
jobjectArray ret=env->NewObjectArray(大小,env->FindClass(“[C”),NULL);
for(无符号整数i=0;iSetObjectArrayElement(ret,i,env->NewStringUTF(toChar(env,data.at(i)));
}
返回ret;
}
jcharArray-toChar(JNIEnv*env,字符串){
无符号整数n=0;
const char*p=string.c_str();
而(*p++){
n++;
}若(n)为北卡罗莱(n);
环境->设置字符区域(arr,0,n,(jchar*)p);
返回arr;
}

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

您需要在本机代码中将本地字符集转换为UTF-16,然后使用
NewString
,或者将
byte[]
数组传递到Java代码中,然后使用参数。要使用的字符集取决于文件系统支持的内容


现在,您要么将非MUTF8数据放入
NewStringUTF
,如果启用CheckJNI,则会有噪音地失败,要么将字节值放入UTF-16字符,而不进行字符集转换。

我也尝试了byte[](而不是char[]),使用不同的字符集(UTF-8、UTF-16、us ansii),结果是无法读取文件名。这就是问题所在。您需要找到与文件系统匹配的字符集。您知道它使用的是什么字符集吗?如果您不确定,请添加一些有问题的文件名的十六进制转储(以及预期的外观)对于这个问题,也许有人会认出它。从简单的东西开始,例如一个只有ASCII字符的名字,中间有一些不寻常的东西。(如果文件名都是ASCII,那么就有别的事情发生了。)