我正在尝试使用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结尾。
这是一个错误吗?这是预期的行为吗?
最终,我的问题是:我该怎么做才能解决这个问题?
非常感谢提前。
答案 0 :(得分:2)
Android 5.0的“预览”版本在最终版本中修复了一些问题。有关详细信息,请参阅this bug report。
如果你得到.o文件的十六进制转储(在Linux上有例如xxd
)并搜索字符串的片段,你可以看到它在可执行文件中的编码方式。如果它是有效的UTF-8 - 当我使用桌面gcc进行编译时,我得到{1'c3 b6
- 那么它应该可以工作。如果它使用其他一些编码,Android libc可能会将其拒绝为无效。
如果二进制文件中的字符串看起来不是UTF-8,请检查您的makefile是否有-fexec-charset=
之类的内容。