我正在使用 Swig 将 C/C++ 包装到 Java 中。
我有这个结构:
struct score {
void* goals;
uint32_t goals_number;
}
我需要使 goals 和 goals_number 相等。
这种类型映射仅在函数参数奇偶校验的情况下对我有用:
%apply (unsigned int *OUTPUT, size_t LENGTH) { (void* goals, uint32_t goals_number) };
如何在结构字段上应用奇偶校验?怎么做?
非常感谢!
编辑:
我需要在 Java 端以这种方式获取 getter 和 setter 的签名:
public class Score {
// ... other methods
void setGoals( int goals[] ){
//...
}
int[] getGoals(){
//...
// goals.length must be equal to "goals_number"
}
}
代替:
public void setGoals(SWIGTYPE_p_void value) {
MyModuleJNI.Score_goals_set(swigCPtr, this, SWIGTYPE_p_void.getCPtr(value));
}
public SWIGTYPE_p_void getGoals() {
long cPtr = MyModuleJNI.Score_goals_get(swigCPtr, this);
return (cPtr == 0) ? null : new SWIGTYPE_p_void(cPtr, false);
}
public void setGoals_number(long value) {
MyModuleJNI.Score_goals_number_set(swigCPtr, this, value);
}
public long getGoals_number() {
return MyModuleJNI.Score_goals_number_get(swigCPtr, this);
}
试试 %extend
指令:
// score.i:
%{
#include "Score.h"
%}
%include "Score.h"
%extend Score %{
void setGoals( int goals[] ){
//... use $self->goals_number and $self->goals to populate
// goals array
}
int* getGoals(){
//...
int* swigGoals = new int[$self->goals_number];
// populate swigGoals, then
return swigGoals;
}
%}
如果您希望能够修改返回的数组,您可能需要修改一下。
您可能希望隐藏这两个公共(public)属性,以便它们在 Java 中不可见(使用 %ignore Score::goals
等)。
我是一名优秀的程序员,十分优秀!