将byte []从Java传递给C ++

时间:2015-11-03 16:46:52

标签: java swig

我试图使用SWIG将带有二进制数据的字节[]参数和一个字符串参数从Java传递到C ++代码。

这是我的.i和.cpp文件:

my_module.i

%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但没有成功。

1 个答案:

答案 0 :(得分:3)

您希望SWIG在Java和C ++类型之间执行转换,即

  1. Java byte[]unsigned char *
  2. Stringchar *
  3. 此类转化的常规工具是SWIG typemaps。方便的是,许多已经由SWIG提供,只需要应用。看看Java typemap documentation

    后一种转换(Stringchar *)由SWIG自动完成(使用匹配char *参数的预定义类型映射)。

    使用预定义的文字映射

    标准转化非常类似于您想要的(byte[]char *)由" char * BYTE"文件various.i中定义的文字地图。要使用它,您只需添加

    即可
    %include various.i
    %apply char *BYTE { char *buffer_variable_name };
    

    位于swig接口文件的顶部,其中buffer_variable_name是函数参数中变量的名称(类型映射可以按名称匹配)。有关详细信息,请参阅常规typemap documentationJava typemap documentation

    但是,这并不是您想要的,因为您的函数需要unsigned char *。如果您可以在Java端使用java.nio.Buffer而不是byte[](需要通过allocateDirect分配),various.i中预定义的一组不同的类型映射可以通过

    使用
    %apply unsigned char *NIOBUFFER { unsigned char *buffer_variable_name };
    

    写你的"拥有" typemaps

    在您的情况下,您希望与提供的" 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 };
    

    使用这些预定义的文字图作为基本示例,并阅读文档,然后您可以根据需要开始编写自己的自定义文字图。

    希望这有帮助。