JNA:如何处理未知的结构?

时间:2013-07-31 21:25:26

标签: java c struct 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
 }

2 个答案:

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