Android NDK 中通过 SWIG 的 Java 字符串用奇怪的字符代替空字节

标签 java android c android-ndk swig

我正在使用 SWIG 生成一些 C 代码的接口(interface),我已将其编译为 Android NDK 库。我的 C 代码 NDK 库使用结构 MY_STRUCT,它包含在进出方向传递数据的 char* 元素,并且 SWIG 生成的 JNI 就此而言工作正常,即我可以读取 C 代码中的字符串,设置数据并根据需要在Java代码中读取结果。

但是我有一个问题,如果我传入一个包含空字节的 java 字符串,那么空值将被替换为“\300\200”

例如,如果我按如下方式在 java 中创建一个字符串:

MY_STRUCT myStruct = new MY_STRUCT();
byte[] myBytes = new byte[21];
String myString = new String(myBytes);
myStruct.setName(myString);

然后 myStruct 将其名称字段根据需要设置为 21 个空字节,这在 Java 调试器中可见,但传递到我的 NDK 库代码的字符串如下所示,如在 NDK C 调试器中所示:

"\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200\300\200"

我的 SWIG .i 文件包含以下相关部分:

%include various.i
%include cpointer.i
%pointer_functions(int, intp);

%include ../../../mydir/myheader.h

myheader.h 有以下相关部分:

typedef struct
{
...
    char* name;
...
} *P_MY_STRUCT, MY_STRUCT;

C 代码调试良好,我可以读写 MY_STRUCT 的名称等元素指向的所有字符串,唯一的问题是将输入到 SWIG 生成的 JNI 代码的字符串的空元素转换为奇怪的“NDK 库中 C 代码中的\300\200"元素。

编辑:

考虑替代方案:我有几个函数采用字节数组而不是字符串作为 C 函数 char* 参数,这是在 myModule.i 文件中实现的,如下所示:

bool myFunc(P_MY_STRUCT, char* BYTE, int32_t);

在 SWIG 中是否有任何方法可以为结构成员实现与 BYTE 功能等效的功能?我尝试在 myModule.i 中使用相同的 BYTE 技巧,如下所示,但它没有用:

typedef struct
{
...
    char* BYTE;
...
} *P_MY_STRUCT, MY_STRUCT;

再次感谢,

最佳答案

这是 Java 已知的疯狂行为,并在这个问题的答案中进行了描述:

What does it mean to say "Java Modified UTF-8 Encoding"?

关于Android NDK 中通过 SWIG 的 Java 字符串用奇怪的字符代替空字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257823/

相关文章:

c - 调试 : is it possible to print all local variable (with values) of C code without going into each stack frame?

c - stdin 和 stdout 实际上是同一个文件吗?

java - 如何使用 java.text.NumberFormat 来添加单位?

java - 用你自己的话说 : what is JavaFX and Java applet? 它们有什么区别?

java - Spring Integration Java DSL HTTP 在超时错误内未收到回复

java - Gradle:项目依赖于库,但本身不是库

c - 循环这个问题的更好方法是什么?

java - C# IEnumerable 相当于 java Iterator 的 next() 方法?

android - android app bundle 和 proguard rules 做同样的优化吗?

android - 与android gradle项目冲突