我正在使用 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 已知的疯狂行为,并在这个问题的答案中进行了描述:
关于Android NDK 中通过 SWIG 的 Java 字符串用奇怪的字符代替空字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257823/