当前位置: 首页 > 知识库问答 >
问题:

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

祝叶五
2023-03-14

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

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

rray.to字符串(扫描("/存储/")); -

这里是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方法返回字符串[]

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;
    }

共有1个答案

梁修贤
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我在c ++函数中获得了一个float *,我需要在jfloatArray中将其转换以返回到我的Java代码。 如何将float *转换为jfloatArray? 谢谢 问题答案: 要将float *转换为jfloatArray,可以使用NewFloatArray, 您可以使用以下代码: 变量“数据”只是简单的示例,因此您可以使用代码。 另外,将com_your_packagename

  • 问题内容: 我正在寻找python库或任何将.XLSX文件转换为.CSV文件的帮助。 问题答案: 使用该模块阅读excel ,然后可以使用该模块创建自己的csv。 在命令行中安装xlrd模块: Python脚本:

  • 问题内容: 我已经通过使用JNI 将URL字符串从Java传递为C代码作为数据类型。我的库方法需要一个as url。 我如何转换的? PS:在C中使用jcharArray有什么优势吗?(即在本地方法中传递而不是字符串) 问题答案: 这是我开始使用JNI时发现的几个有用的链接 http://en.wikipedia.org/wiki/Java_Native_Interface http://down

  • 问题内容: 我知道如何获取mysql行并将其转换为json: 但: 数据库行具有不同的类型,例如int,float,string。通过使用json_encode()进行转换,所有结果都是字符串。 有没有比这更好的方法来更正类型: 我想遍历键并添加0,因为: 第一个编码规则:干-不要重复自己 但我不能,因为: 行还具有数字以外的其他类型(字符串,日期) 有很多列 设计在开发人员中,因此列名经常更改

  • 问题内容: 我有一个非常简单的测试程序,可以打印出以下数字。 即 打印输出: df输出根fs: 但是,这是我感到困惑的地方。 25837672 + 14159676!= 42137846(实际上是39997348) 因此,如果我要执行calc 14159676/42137864 * 100,我得到的df打印结果为33%,而不是36%。 但是如果我计算 14159676/39997348 * 100

  • 我有C/C++源代码(在Windows上运行良好)将输入帧转换为新帧。 > 将byte[]帧从Java转换为JNI jarrayByte 将jarrayByte转换为Jyte* 从JByte*创建新的cv::mat原始代码* } 我的Java代码: