我试图使用SWIG将带有二进制数据的字节[]参数和一个字符串参数从Java传递到C ++代码。
这是我的.i和.cpp文件:
%module mymodule
%inline %{
extern void compress_buffer_to_file(unsigned char *buffer, char *ofname);
%}
my_module.cpp
void compress_buffer_to_file(unsigned char *buffer, char *ofname){
.........
}
Java包装器中生成的方法:
public static void compress_buffer_to_file(SWIGTYPE_p_unsigned_char buffer, String ofname) {
my_moduleJNI.compress_buffer_to_file(SWIGTYPE_p_unsigned_char.getCPtr(buffer), ofname);
}
如何定义一个.i文件,它将生成一个Java包装器,让我将byte []而不是SWIGTYPE_p_unsigned_char传递给compress_buffer_to_file方法,或者?如何将Java端的现有byte []与SWIGTYPE_p_unsigned_char相关联?
我尝试使用typemap但没有成功。
答案 0 :(得分:3)
您希望SWIG在Java和C ++类型之间执行转换,即
byte[]
到unsigned char *
和String
至char *
。此类转化的常规工具是SWIG typemaps。方便的是,许多已经由SWIG提供,只需要应用。看看Java typemap documentation。
后一种转换(String
到char *
)由SWIG自动完成(使用匹配char *
参数的预定义类型映射)。
标准转化非常类似于您想要的(byte[]
到char *
)由" char * BYTE
"文件various.i
中定义的文字地图。要使用它,您只需添加
%include various.i
%apply char *BYTE { char *buffer_variable_name };
位于swig接口文件的顶部,其中buffer_variable_name
是函数参数中变量的名称(类型映射可以按名称匹配)。有关详细信息,请参阅常规typemap documentation和Java typemap documentation。
但是,这并不是您想要的,因为您的函数需要unsigned char *
。如果您可以在Java端使用java.nio.Buffer
而不是byte[]
(需要通过allocateDirect
分配),various.i
中预定义的一组不同的类型映射可以通过
%apply unsigned char *NIOBUFFER { unsigned char *buffer_variable_name };
在您的情况下,您希望与提供的" char * BYTE
"基本相同类型图,但用于unsigned char *
的函数。因此,您只需将这些内容从various.i
复制到新文件ubyte.i
并稍加调整即可:
ubyte.i
%typemap(jni) unsigned char *UBYTE "jbyteArray"
%typemap(jtype) unsigned char *UBYTE "byte[]"
%typemap(jstype) unsigned char *UBYTE "byte[]"
%typemap(in) unsigned char *UBYTE {
$1 = (unsigned char *) JCALL2(GetByteArrayElements, jenv, $input, 0);
}
%typemap(argout) unsigned char *UBYTE {
JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $1, 0);
}
%typemap(javain) unsigned char *UBYTE "$javainput"
/* Prevent default freearg typemap from being used */
%typemap(freearg) unsigned char *UBYTE ""
通过添加swig界面文件的顶部以相同的方式使用它们:
%include ubyte.i
%apply unsigned char *UBYTE { unsigned char *buffer_variable_name };
使用这些预定义的文字图作为基本示例,并阅读文档,然后您可以根据需要开始编写自己的自定义文字图。
希望这有帮助。