SWIG / Java从C ++获得未知大小的缓冲区

时间:2016-08-03 23:04:36

标签: java c++ swig

我有一个C ++函数 foo(unsigned char*& ptr) 它创建一个缓冲区并用二进制数据填充它并设置ptr指向它。 我需要从Java获取缓冲区的内容。

为了澄清,C ++代码可以像这样使用:

unsigned char* ptr;
foo(ptr);
//now ptr points to a buffer, do what you want, eg
x=ptr[1];

使用arrays_java.i将无效,因为SWIG需要提前知道数组大小。我还尝试为unsigned char*修改了unsigned char*&的内置类型映射NIOBUFFER,但这会产生生成的C ++包装器代码的问题,其中JVM在尝试使用它时崩溃了。我也不认为carrays.i使用unsigned char*&可能会有效,因为参数为unsigned char*,而不仅仅是%array_functions (int * Iarr),但我还没有尝试过这个呢。 (编辑使用void test(int*& ia) { ia[0]=1; ... } 作为测试函数

arrays_java.i
使用与NIOBUFFER类型映射相同的EXCEPTION_ACCESS_VIOLATION导致JVM崩溃)

有没有办法从C ++ / JNI包装器代码中获取缓冲区的大小,然后在JNI代码中创建一个已知大小的Java数组,以便我可以利用type*&

有没有办法使用NIOBUFFER,可能修改了它的类型映射和/或生成的C ++包装器?

有没有办法将某些type*视为carrays.i,以便我可以使用array_functions

因为NIOBUFFER类型映射和type*&都崩溃了JVM,我觉得问题的根源是{{1}}参数,解决这个问题的方法将允许这两个选项中的任何一个。我该怎么做?

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。假设我的问题中有相同​​的函数foo

  1. 编写一个函数,比如bar,创建一个本地指针,将其传递给foo,然后返回它。在这种情况下,bar将是

    unsigned char* bar() { unsigned char* ptr; foo(ptr); return ptr; }

  2. 在SWIG中:使用%array_classes,即array_class(unsigned char, ShortArray)

  3. 使用bar通过frompointer返回的指针创建数组类的实例。 ShortArray sa = ShortArray.frompointer(example.bar())

  4. 这避免了让SWIG与type*&一起使用作为argin / out的麻烦,因为你现在正在处理SWIG处理得很好的普通指针和数组"开箱即用" 。它还允许Java端接收任意大小的缓冲区,并提供更多类似Java的语法。