1

如果我没记错的话,JNA Structure是通过依赖其相应 Java 类的公共字段来构建结构的,该类应该扩展Structure. 我的问题是我需要传递一个事先不知道其声明的结构(假设它在运行时已知)。我只有一个Objects 列表,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
 }
4

2 回答 2

0

如果您不知道结构的内容,则将其称为“不透明”。

对于 opaque struct *,可以使用com.sun.jna.Pointer来表示结构地址。

于 2013-08-01T16:59:56.153 回答
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);
于 2014-01-16T03:34:19.737 回答