SWIG 指针和 Java 数组

Bug*_*boy 4 java java-native-interface swig

SWIG 文档解释了 C 中的各种输入类型,如下所示:

void spam1(Foo *x);      // Pass by pointer
void spam2(Foo &x);      // Pass by reference
void spam3(Foo x);       // Pass by value
void spam4(Foo x[]);     // Array of objects
Run Code Online (Sandbox Code Playgroud)

...在 Java 中都将采用单一类型的参数,如下所示:

Foo f = new Foo();  // Create a Foo
example.spam1(f);   // Ok. Pointer
example.spam2(f);   // Ok. Reference
example.spam3(f);   // Ok. Value.
example.spam4(f);   // Ok. Array (1 element)
Run Code Online (Sandbox Code Playgroud)

类似地,对于 C 中的返回类型:

Foo *spam5();
Foo &spam6();
Foo  spam7();
Run Code Online (Sandbox Code Playgroud)

...所有三个函数都将返回一个指向某个 Foo 对象的指针,该对象将分配给一个 Java 对象变量,最后一个需要分配一个值类型,Java 垃圾收集将在释放时处理该值类型。

但是假设 spam5() 返回一个指向数组的指针。在 Java 中,我必须使用数组语义来访问单个元素,但我认为我不能这样做:

Foo foo[] = spam5();
Run Code Online (Sandbox Code Playgroud)

我什至不认为编译器会接受 (Foo[]) 的强制转换,那么这在 SWIG 中是如何工作的?

Dav*_*ler 5

这个问题没有简单或自动的解决方案。相信我,我看过了。

问题是 SWIG 不知道您返回的数组应该有多大,因此它无法生成 Java 数组。您也不能提供大小作为函数的参数(很粗略) - 类型映射不能那样工作。

在一般情况下,您必须编写另一个包装函数,它接受一个 C 数组和一个长度作为输出参数,并使用类型映射将这两个参数转换为 Java 数组。或者,如果您不介意使用 carrays.i,您可以跳过第二步,直接从 Java 使用 C 数组。