我有一个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}}参数,解决这个问题的方法将允许这两个选项中的任何一个。我该怎么做?
答案 0 :(得分:0)
我想出了一个解决方案。假设我的问题中有相同的函数foo
:
编写一个函数,比如bar
,创建一个本地指针,将其传递给foo
,然后返回它。在这种情况下,bar
将是
unsigned char* bar()
{
unsigned char* ptr;
foo(ptr);
return ptr;
}
在SWIG中:使用%array_classes
,即array_class(unsigned char, ShortArray)
使用bar
通过frompointer
返回的指针创建数组类的实例。
ShortArray sa = ShortArray.frompointer(example.bar())
这避免了让SWIG与type*&
一起使用作为argin / out的麻烦,因为你现在正在处理SWIG处理得很好的普通指针和数组"开箱即用" 。它还允许Java端接收任意大小的缓冲区,并提供更多类似Java的语法。