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);