如果我没记错的话,一个JNA Structure通过依赖其相应 Java 类的公共(public)字段构建结构,该类应扩展 Structure
。我的问题是我需要传递一个声明事先未知的结构(假设它在运行时已知)。我只有一个 Object
的列表,C 库希望它作为一个(对一个)结构的引用。我是否仍可以使用 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
}
最佳答案
如果您不知道该结构的内容,则它被称为“不透明”。
对于不透明的struct *
,可以使用com.sun.jna.Pointer
来表示结构地址。
关于java - JNA:如何处理未知结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17981282/