转义JNI代码的Java字符串

时间:2017-02-25 20:06:55

标签: java c java-native-interface jnienv

我有一个带有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源代码中工作的字符串文字。

2 个答案:

答案 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数组,而是必须逐个转换它们。这有点麻烦,但可行。祝你好运!