这些类型中的一些很容易映射到Java中简单直观的对象上:
- 对于
off_t
您可以使用:%apply int { off_t };
告诉SWIG将其
off_t视为
intJava。除非您期望
off_t大于一个int,否则这可能会起作用。对于某些常见的typedef,SWIG已经在库中提供了适当的映射,我有点惊讶off_t不是其中之一。
(您也可以选择在界面文件中显示SWIG typedef,而不是使用
%apply)
- 对于“简单”数组(即不是结构的事物的数组),其操作如下:
%include <arrays_java.i>
足以生成一个直观的Java界面,例如添加导致
int field_offsets[VRTTXT_FIELDS_MAX]被包装为as
publicvoid setField_offsets(int[] value)和相应的get的添加。在为setter生成的代码中,有一个检查大小匹配的测试-
如果大小不匹配,则会在运行时抛出异常,因为Java中没有编译时间数组大小的概念。
- 这个答案讨论了Java的包装
FILE*
。在这种情况下,最简单的解决方案是使用类似以下内容的方法:%ignore text_file
%include “header.h”
%extend gaiaTextReader {
void setTextFile(const char *fn) {
$self->text_file = fopen(fn, “r”);
}
}
它隐藏自动设置/获取
text_file,而是公开一个带字符串并调用的setter
fopen。
您可以选择仍然很明显的链接答案中所示的更复杂的实现,或者可以使用它
%inline来提供使用
SWIGTYPE_p_FILEJava 创建的替代方法。
至于结构的阵列,最简单的办法是使用
%ignore
和%extend
再次,例如对于columns
这是:%ignore columns;
%include “header.h”
%extend gaiaTextReader {
struct vrttxt_column_header *getColumn(int i) {
return $self->columns + i;
}void setColumn(struct vrttxt_column_header c, int i) {
$self->columns[i] = c;
}
}
这比编写类型映射表简单(后者将涉及很多JNI调用,以从
Object数组复制到结构数组)。
一个更优雅的解决方案可能是在Java中编写扩展的内容
AbstractList(使用Java代码类型映射,具体取决于您要执行的操作),然后通过在Java中公开的内容来返回代理
%extend
成员
%extend
可以采用相同的方法toUtf8
:%ignore toUtf8;
%include “header.h”
%extend gaiaTextReader {
void setToUtf8(const char *from) {
$self->toUtf8 = iconv_open(“topre”, from);
}
}
(我不确定该字段的用法是否正确,但是无论如何都适用该原则)。
您的链表可以从Java中“自然地”遍历,尽管有可能/明智的(?)提供实现的代理
AbstractSequentialList
。因为
int
确实如此,enum
您仍然可以使用适当的Java枚举来表示它:%include <enums.swg>
%javaconst(1);
enum Type;
%typemap(jstype) int type “$typemap(jstype,enum Type)”
%typemap(javain) int type “$typemap(javain,enum Type)”%include “header.h”
enum Type { TEXT=VRTTXT_TEXT,
INTEGER=VRTTXT_INTEGER,
DOUBLE=VRTTXT_DOUBLE,
NONE=VRTTXT_NULL };
(这里的顺序很重要-伪造的
enum需要发生在之后
%include,但是类型映射和前向声明需要发生在它之前)。



