我正在尝试在C中为以下函数创建JNI包装器:
int err = new_instance(const char* name, instance_t* instance);
Run Code Online (Sandbox Code Playgroud)
name- 输入,instance- 输出
int err = get_value(const instance_t instance, int *val);
Run Code Online (Sandbox Code Playgroud)
instance- 输入,val- 输出
其中instance_t定义为:
typedef void* instance_t;
Run Code Online (Sandbox Code Playgroud)
我完全迷失在Java的SWIG手册中,因为它不仅仅支持输入参数作为输出类型.我用Python包装器没有任何问题(如下所示).
// instance_t [argout]
%typemap(in, numinputs=0) instance_t* instance (instance_t temp = 0) {
$1 = &temp;
}
%typemap(argout) instance_t *instance {
%append_output(PyLong_FromLongLong((long long)* $1));
}
// instance_t [in]
%typemap(in) instance_t instance {
$1 = (instance_t) PyLong_AsLongLong($input);
}
Run Code Online (Sandbox Code Playgroud) 我在使用SWIG(版本3.0.6)围绕C++库生成Python包装器时遇到了一些麻烦.
我的问题涉及应用OUTPUT类型映射,特别是在指针/类类型引用的情况下.
为了说明,这是我想要的标准类型,它的工作原理:
// .h
int add(const long arg1,const long arg2,long& resultLong);
// interface.i
%apply long& OUTPUT { long& resultLong };
int add(const long arg1,const long arg2,long& resultLong);
// projectWrapper.py
def add(arg1, arg2):
return _projectWrapper.add(arg1, arg2)
addTerm = _projectWrapper.add
// usage
>>> result = projectWrapper.add(2, 4)
>>> print result
[0, 6L]
Run Code Online (Sandbox Code Playgroud)
您不必传入"resultLong",但它会自动附加到结果中.大!
但是,当输出类型是指向类类型的指针时,这似乎没有像我期望的那样工作:
// .h
int GetClassType(const char* name, exportedClassType*& resultPointer);
class exportedClassType
{...}
// interface.i
%apply exportedClassType*& OUTPUT { exportedClassType*& resultPointer };
int GetClassType(const char* name, exportedClassType*& resultPointer);
// …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来扩展(即使用 %extend 指令向类型添加新成员)在库文件本身中定义的类型,而库的头文件仅提供该类型的前向声明。
将类型视为其定义在编译时已知,会导致以下警告:
Warning 303: %extend defined for an undeclared class [name of the type].
Run Code Online (Sandbox Code Playgroud)
有没有人知道这个问题的解决方案或解决方法?我确定有一个,因为 SWIG 的文档指出 swig 每次找到一个时都假定未知类型是结构体或联合体。
提前谢谢了!