我有一个带有Unicode字符的Java字符串文字,需要转换为C字符串文字,可以使用JNIEnv.NewString
加载。
不幸的是,上面的方法采用指向unsigned short
(jchar)数组的指针。我尝试使用如下代码:
unsigned short str[] = {65, 66, 67};
jstring java_str = (*env)->NewString(env, str, 3);
然而,这需要很大的空间,不是人类可读的,并且难以维护。
有没有办法将字符串文字转换为C中的unsigned short[]
,同时仍能使用Java的UTF-16字符?
这种逃避可以以编程方式完成吗?即将java.lang.String
转换为可在C源代码中工作的字符串文字。
答案 0 :(得分:2)
如果您可以使用C11和GCC,则可以使用GCC中为UTF-16的新char16_t
:
#include <uchar.h>
#ifndef __STDC_UTF_16__
#error "char16_t not UTF-16"
#endif
...
char16_t my_string[] = u"abc";
jstring java_str = (*env)->NewString(env, str, 3);
使用gcc -std=c11
但无论如何,大多数时候只使用ASCII字符串,因此可以简单地使用
jstring java_str = (*env)->NewStringUTF(env, "abc");
假设该字符串采用修改后的UTF-8编码(即UTF-16代理对分别编码为UTF-8;以及以空值终止)。由于ASCII是UTF-8的子集,因此可用于ASCII字符串。
答案 1 :(得分:1)
您正在寻找的不是逃避。
您想要做的是使用人类可读的字符串文字在C中指定字符串,并且能够将其传递给JNI NewString()
。
您必须阅读wchar_t
。
请参阅What is a "wide character string" in C language?和https://en.wikibooks.org/wiki/C_Programming/C_Reference/wchar.h
您需要做的是将字符串文字定义为wchar_t
(使用上面帖子中解释的“L”符号),然后编写一个转换函数,将wchar_t
的这些数组转换为数组jchar
。
不幸的是,C标准没有定义wchar_t
的精确实现,而是让C编译器供应商按照自己的意愿去做,所以你的C编译器有可能不会对wchar_t
进行处理。 1}}作为16位数量。在这种情况下,您的转换函数将无法简单地将wchar_t
数组转换为jchar
数组,而是必须逐个转换它们。这有点麻烦,但可行。祝你好运!