JNA:如何处理未知的结构?
如果我没弄错的话, 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 }
如果您不知道结构的内容,那么它被称为“不透明”。
对于opaque struct *
,可以使用com.sun.jna.Pointer
来表示结构地址。
您仍然可以使用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);