我正在使用SWIG来生成一些我编译为Android NDK库的C代码的接口。我的C代码NDK库使用了一个结构体,MY_STRUCT包含char *元素,可以在输入和输出方向传递数据,并且SWIG生成的JNI可以正常工作,也就是说,我可以读取C代码中的字符串,设置数据并根据需要在Java代码中读取结果。通过SWIG在Android NDK中的Java字符串NDK具有奇怪的字符,而不是空字节
但是我有一个问题,如果我通过在包含空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"
我痛饮.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的名称etc元素指向,唯一的问题是将输入到SWIG生成的JNI代码的字符串的null元素转换为NDK库中C代码中奇怪的“\ 300 \ 200”元素。
编辑:
考虑一种替代方案:我有取字节数组,而不是为C-函数的char *参数字符串和这在myModule.i文件实现了若干功能如下:
bool myFunc(P_MY_STRUCT, char* BYTE, int32_t);
SWIG中是否有任何方法可以实现结构成员的BYTE功能?我试着用在myModule.i相同的字节招如下,但它没有工作:再次
typedef struct
{
...
char* BYTE;
...
} *P_MY_STRUCT, MY_STRUCT;
感谢,
请注意,我没有标记这个问题作为一个在我的答案的副本;尽管答案基本相同,但*问题*是不同的! – 2014-10-08 13:55:05