如果我没有弄错的话,JNA Structure依赖于相应Java类的公共字段来构建结构,该类应该扩展Structure
。我的问题是我需要传递一个事先不知道声明的结构(假设它在运行时已知)。我只有一个Object
的列表,C库期望它作为(对a)的结构。我还可以使用Structure
类,还是我必须手工构建一个Memory对象,处理大小,对齐/打包?
例如:
/* native code */
typedef struct mystruct {
int x;
float y;
} mystruct;
void dosomething(mystruct * s) {
s->y += s->x;
}
在Java中:
...
callFunctionWithSt("dosomething",
new Object[]{Integer.valueOf(2),Float.valueOf(3.0)});
...
void callFunctionWithSt(String funcName, Object[] structVals) {
NativeLibrary nl = ...
Pointer arg = ... // or Memory ... or Structure
// build structure
for (Object objJava : structVals) {
valJna = convertFromJavaToJnaObject(objJava);
// fill structure
}
f.invoke(arg);
}
Object convertFromJavaToJnaObject(Object) {
// assume we know how to do this
}
答案 0 :(得分:0)
如果你不知道结构的内容,那么它被称为“不透明”。
对于不透明的struct *
,您可以使用com.sun.jna.Pointer
来表示结构地址。
答案 1 :(得分:0)
您仍然可以使用Structure
。像这样定义你的接口方法:
interface SomeLib {
public static final SomeLib INSTANCE =
(SomeLib) Native.loadLibrary("SomeLib", SomeLib.class);
Pointer getSomeStruct();
}
然后当你打电话时,你就这样做了:
Pointer someValue = SomeLib.INSTANCE.getSomeStruct();
// do something here to determine what type it is
SpecificStructure struct = new SpecificStructure(someValue);