我有一个C++函数 foo(unsigned char*& ptr)
创建一个缓冲区并用二进制数据填充它并设置ptr指向它。 我需要从Java获取缓冲区的内容。SWIG/Java从C++获取未知大小的缓冲区
为了澄清,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
与this answer一样可以工作,因为参数是unsigned char*&
,而不仅仅是unsigned char*
,但我还没有尝试过。 (编辑使用%array_functions (int * Iarr)
的测试功能
void test(int*& ia)
{
ia[0]=1;
...
}
导致JVM崩溃与EXCEPTION_ACCESS_VIOLATION作为与NIOBUFFER类型映射发生)
是否有一种方式来获得从C++/JNI包装缓冲区的大小代码,然后在JNI代码中创建已知大小的Java数组,以便我可以利用arrays_java.i
?
有没有办法使用NIOBUFFER,可能修改其类型映射和/或生成的C++包装?
有没有办法将一些type*&
作为type*
来处理,所以我可以使用carrays.i
?
因为无论是NIOBUFFER类型映射和array_functions
坠毁的JVM,我有一种感觉,我的问题的根源是type*&
参数和解决此问题的方法将允许其中的任意一种两个选项。我该怎么做呢?
如果您的主程序是C语言并且您不使用JNI,而不知道大小,您将如何使用缓冲区? – immibis
在不知道数组大小的情况下,无法创建Java数组。 – immibis
我特别说我正在使用SWIG,它生成了JNI代码,我正在考虑的一种可能性是修改该代码,使其符合我的要求。这可能包括获取C++缓冲区大小,并用另一个适当的大小替换从Java传递的数组,并将该数组传回给Java。 当然,我对更简单的方法感兴趣。 – BenK