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 中是如何工作的?
这个问题没有简单或自动的解决方案。相信我,我看过了。
问题是 SWIG 不知道您返回的数组应该有多大,因此它无法生成 Java 数组。您也不能提供大小作为函数的参数(很粗略) - 类型映射不能那样工作。
在一般情况下,您必须编写另一个包装函数,它接受一个 C 数组和一个长度作为输出参数,并使用类型映射将这两个参数转换为 Java 数组。或者,如果您不介意使用 carrays.i,您可以跳过第二步,直接从 Java 使用 C 数组。
| 归档时间: |
|
| 查看次数: |
3622 次 |
| 最近记录: |