(Android NDK)包含非ASCII字符的字符串被截断

时间:2016-01-20 23:54:05

标签: c android-ndk java-native-interface

我正在尝试使用NDK和JNI将用C语言编写的程序移植到Android中,而且我遇到了一个让我疯狂的荒谬问题。

为了缩短它,如果我这样做......

char str[1024];
sprintf(str, "Hellö, this is söme stränge letters.");

... strlen(str)按预期返回35。正确?

但是,如果我包含一个说明符,并执行此操作......

char str[1024];
sprintf(str, "Hellö again. Here's a number: %d", 1);

... strlen(str)返回4.

你看到发生了什么吗?如果我尝试格式化它们,NDK似乎不能(或不会)接受字符串中的非ASCII字符。

每当我在格式字符串中包含ASCII字符> 127时,它就会被切断。就像是以NULL结尾。

这是一个错误吗?这是预期的行为吗?

最终,我的问题是:我该怎么做才能解决这个问题?

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

Android 5.0的“预览”版本在最终版本中修复了一些问题。有关详细信息,请参阅this bug report

如果你得到.o文件的十六进制转储(在Linux上有例如xxd)并搜索字符串的片段,你可以看到它在可执行文件中的编码方式。如果它是有效的UTF-8 - 当我使用桌面gcc进行编译时,我得到{1'c3 b6 - 那么它应该可以工作。如果它使用其他一些编码,Android libc可能会将其拒绝为无效。

如果二进制文件中的字符串看起来不是UTF-8,请检查您的makefile是否有-fexec-charset=之类的内容。