将jcharArray转换为具有正确编码jni的String
Convert jcharArray to String with right encoding jni
我有返回目录中文件数组的本地方法。public static native char[][] scan(字符串路径);我不能返回字符串数组,因为如果文件编码无效-一切都崩溃了问题是正确转换char[]到java端字符串,当我尝试新的字符串(字符);我得到不可打印的字符串(无效)。请纠正我。
下面是输出的例子(If方法返回String[])
Array.toString(scan("/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����]
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")。
您需要在本机代码中将本地字符集转换为UTF-16,然后使用NewString
,或者将byte[]
的数组传递到Java代码中,然后使用接受字符集参数的String构造函数。要使用的Charset取决于您的文件系统支持什么。
现在您要么将非mutf8数据放入NewStringUTF
,如果启用CheckJNI将会失败,或者您将字节值放入UTF-16字符而不进行字符集转换。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 通过JNI传递数据数组的最快方法是什么
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 绝对编码器十六进制输入
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 防止C++中的硬编码数字
- 将 C# DLL 导入 C++ 以用于 JNI
- 用C++包装 Java 库 (JNI)
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- JNI从Android调用C++方法
- 使用JNI连接到JAVA的JNI编码和C/C编码之间的差异
- 将jcharArray转换为具有正确编码jni的String