java - JNA:如何处理未知结构?

标签 java c struct jna

如果我没记错的话,一个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/

相关文章:

python - Python 中的 printf 格式 f 与 d

c - 如何删除一个数组结构体,并且最后一个索引不能被其他索引替换?

c - 'b3Vec' 之前的预期说明符限定符列表

java - 如何使用maven从具有通用模式的多个xsd生成java类

c++ - 以下片段的区别

c - C 内存泄漏的现实危险?

swift - 使用时从结构返回值

java - 将网络摄像头视频流式传输到 AWS Kinesis?

java - 尝试添加棉花糖权限支持时无法解析符号 'LocationService'

java - 为什么我的相框什么都不显示?