c用法中的jstring到char *未转换为可打印格式

Posted

技术标签:

【中文标题】c用法中的jstring到char *未转换为可打印格式【英文标题】:jstring to char* in c usage not converting into printable format 【发布时间】:2015-11-03 10:13:36 【问题描述】:

我正在使用 C 的 z/os 上的调用 API 运行一个简单的 JNI 程序。Java 程序有一个像这样的简单 sayHello() 方法-

public static String sayHello()
    return "Hello World!!!";

调用该方法并打印输出的代码如下-

jmethodID mid=(*env)->GetStaticMethodID(env,cls2,sHStr,sigVoidString);
 jstring j = (jstring)(*env)->CallStaticObjectMethod(env,cls2, mid);
 const char *str = (*env)->GetStringUTFChars(env, j, NULL);
 printf("%s", str);
 (*env)->ReleaseStringUTFChars(env,j,str);

输出打印如下-

..%%?..?.%....

打开 HEX 会显示以下内容,这表明它确实是 HelloWorld!!!-

46666256766222
85CCF07F2C4111

我检查了一些关于相同问题的 SO 帖子,例如 this 和 this,每个帖子都建议使用我正在使用但没有成功的 GetStringUTFChars。这里有什么特定于 z/os 的事情吗?

【问题讨论】:

我不明白十六进制表示如何拼写Hello World!!!。第 3 和第 4 个字符 (ll) 不同的观察表明它没有。此外,最后三个字符也应该彼此相同 (!!!)。 asciitohex.com 显示转换。为了你好世界!!!十六进制等效值为 48 65 6c 6c 6f 57 6f 72 6c 64 21 21 21 也许你的问题与这个www-01.ibm.com/support/knowledgecenter/#!/SSLTBW_1.12.0/…有关 在页面的最后有这个命令转换hello 2 >&1 | iconv -f ISO8859-1 -t IBM-1047 这听起来像问题。我可能会使用一些 API 将 ASCII 转换为 EBCDIC。我可能会尝试这里列出的 __atoe()... 函数www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/…。谢谢。 【参考方案1】:

在这种情况下,使用 __atoe() 函数对我有用。

【讨论】:

两个快速的 cmets...如果您经常这样做,请查看编译器选项“CONVLIT”。设置后,编译器会自动将您的所有文字(例如“Hello World”字符串)转换为不同的代码页,从而节省您在运行时执行此类操作的开销。其次,要小心 __atoe() 因为它只支持 ISO8859(标准 ASCII)。从技术上讲,您发送到 Java 的字符串是 UTF-8。如果您必须处理任意字符串,ICONV() 将是比 __atoe() 更好的解决方案。 它有什么帮助?你能粘贴解决方案吗?

以上是关于c用法中的jstring到char *未转换为可打印格式的主要内容,如果未能解决你的问题,请参考以下文章

怎么把jstring转换成char

char*转换为jstring

我的Android进阶之旅NDK开发之C++如何相互转换jstring和char*

我的Android进阶之旅NDK开发之C++如何相互转换jstring和char*

JAVA/JNI的jstring转换为char*

C++ 数字转字符串 double 转换成字符串 就是char类型的 或者是 jstring也行