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 *未转换为可打印格式的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之C++如何相互转换jstring和char*