在Java和C+之间传递缓冲区+;使用SWIG 我想通过SWIG在java和C++之间传递一段信息(例如1024字节的内存)。C++中定义的结构如下: struct Buffer { unsigned char *addr; size_t size; }

在Java和C+之间传递缓冲区+;使用SWIG 我想通过SWIG在java和C++之间传递一段信息(例如1024字节的内存)。C++中定义的结构如下: struct Buffer { unsigned char *addr; size_t size; },java,c++,swig,Java,C++,Swig,为此,我应该如何编写SWIG接口文件?还不完全清楚您到底想要实现什么 如果要将缓冲区映射到Java字节[],可以使用自定义类型映射: %typemap(jni) Buffer "jbyteArray" %typemap(jtype) Buffer "byte[]" %typemap(jstype) Buffer "byte[]" %typemap(in) Buffer { $1.addr = (unsigned char *) JCALL2(GetByteArrayElements, j

为此,我应该如何编写SWIG接口文件?

还不完全清楚您到底想要实现什么

如果要将
缓冲区
映射到Java
字节[]
,可以使用自定义类型映射:

%typemap(jni) Buffer "jbyteArray"
%typemap(jtype) Buffer "byte[]"
%typemap(jstype) Buffer "byte[]"
%typemap(in) Buffer {
    $1.addr = (unsigned char *) JCALL2(GetByteArrayElements, jenv, $input, 0);
    $1.size = JCALL1(GetArrayLength, jenv, $input);
}
%typemap(argout) Buffer {
    JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $1.addr, 0);
}
%typemap(out) Buffer {
    $result = JCALL1(NewByteArray, jenv, $1.size);
    JCALL4(SetByteArrayRegion, jenv, $result, 0, $1.size, (jbyte *) $1.addr);
    delete[] $1.addr;
}
%typemap(javain) Buffer "$javainput"
%typemap(javaout) Buffer { return $jnicall; }
<> > C++代码,如

  Buffer getData();
  void sendData(Buffer arg);
将映射到Java:

  public static byte[] getData() { ... }
  public static void sendData(byte[] arg) { ... }
将数据传递给Java的困难在于将其放入JVM堆和/或管理数据的生命周期。通过一些复制很容易实现,但是真正的0拷贝解决方案通常需要改变C++接口。 完整示例:

示例.h

#include <stddef.h>
struct Buffer
{
    unsigned char *addr;
    size_t        size;
};
Buffer getData();
void sendData(Buffer);
test.java

class test {
    public static void main(String[] args) throws Exception {
       System.loadLibrary("_example");
       byte[] data = example.getData();
       System.out.println(new String(data));
    }
}
输出

@abcdefghijklmnopqrstuvxyz[\]^`abcdefghijklmnopqrstuvxyz{124;}~⌂

是。我才意识到。谢谢你,梅勒比乌斯
%module example
%{ 
#include "example.h"
%}
%typemap(jni) Buffer "jbyteArray"
%typemap(jtype) Buffer "byte[]"
%typemap(jstype) Buffer "byte[]"
%typemap(in) Buffer {
    $1.addr = (unsigned char *) JCALL2(GetByteArrayElements, jenv, $input, 0);
    $1.size = JCALL1(GetArrayLength, jenv, $input);
}
%typemap(argout) Buffer {
    JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $1.addr, 0);
}
%typemap(out) Buffer {
    $result = JCALL1(NewByteArray, jenv, $1.size);
    JCALL4(SetByteArrayRegion, jenv, $result, 0, $1.size, (jbyte *) $1.addr);
    delete[] $1.addr;
}
%typemap(javain) Buffer "$javainput"
%typemap(javaout) Buffer { return $jnicall; }
%ignore Buffer;
%include "example.h"
class test {
    public static void main(String[] args) throws Exception {
       System.loadLibrary("_example");
       byte[] data = example.getData();
       System.out.println(new String(data));
    }
}