2014-10-08 40 views
1

我正在使用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; 

感谢,

+0

请注意,我没有标记这个问题作为一个在我的答案的副本;尽管答案基本相同,但*问题*是不同的! – 2014-10-08 13:55:05

回答

0

这就是在Java的疯狂行为,在回答这个问题描述:

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

+0

感谢这个有趣的指针,但没有什么可以说如何处理这个问题的?有没有办法来覆盖编码,以便使用标准的UFT-8? – Boo 2014-10-09 07:12:33

+0

我认为你需要在Java中使用实际的UTF-8编码将字符串转换为字节数组,然后将字节数组而不是字符串传递给C.但是,我不是Java程序员,米不知道你怎么做到这一点。 – 2014-10-09 15:21:21