当前位置: 首页 > 知识库问答 >
问题:

回调函数 - JNA 中如何读取结构体?

潘弘博
2023-12-16

jna 中 structure 结构体怎么读取, 在回调函数中 我收到对方返回一个 pointer

是海康的sdk NET_DVR_SetDVRMessageCallBack_v50 的回调函数 有个 pAlarmInfo:Pointer 类型,

想接收为 NET_DVR_ACS_ALARM_INFO 类型, 要怎么做

我试过这样读取, 但没有讲到到

NET_DVR_ACS_ALARM_INFO info = new NET_DVR_ACS_ALARM_INFO()info.read()

共有1个答案

公孙锋
2023-12-16

在 JNA 中读取结构体通常涉及以下几个步骤:

  1. 创建一个结构体类:首先,你需要创建一个 Java 类,该类将映射到你要读取的结构体。这个类应该使用 Structure 注解,以便 JNA 知道它是一个结构体。
import com.sun.jna.Structure;import java.util.Arrays;import java.util.List;@Structure.FieldOrder({"field1", "field2", "field3"})public class NET_DVR_ACS_ALARM_INFO extends Structure {    public int field1;    public int field2;    public int field3;    @Override    protected List<String> getFieldOrder() {        return Arrays.asList("field1", "field2", "field3");    }}

注意,getFieldOrder 方法返回一个包含结构体字段名称的列表,这些字段名称应该与原始结构体的字段顺序相匹配。

  1. 读取结构体:一旦你有了结构体类,你可以使用 Pointer 对象来读取结构体内容。你需要调用 Pointerread 方法,并传递结构体类作为参数。
Pointer pAlarmInfo = ...; // 这是从回调函数接收到的指针NET_DVR_ACS_ALARM_INFO info = new NET_DVR_ACS_ALARM_INFO();pAlarmInfo.read(info);

这里,pAlarmInfo.read(info) 会从指针 pAlarmInfo 读取数据,并将其存储在 info 结构体实例中。

  1. 使用结构体内容:一旦你读取了结构体内容,你就可以直接访问其字段,就像访问普通 Java 类的字段一样。
int field1Value = info.field1;int field2Value = info.field2;int field3Value = info.field3;

这样,你就可以在回调函数中使用这些字段值了。

 类似资料:
  • 问题内容: 我正在从Java程序的Delphi编译的* .so文件中调用函数。经过研究后,JNA似乎是他的路要走。在深入研究一些复杂的Delphi代码之前,我尝试使用一些“ Hello World”代码,但是在获取由Delphi函数返回的字符串时遇到了麻烦。 Delphi代码(helloworld.pp): 我从命令行使用“ fpc -Mdelphi helloworld.pp ” 编译它,生成

  • 问题内容: 我经常看到人们使用Perl数据结构代替配置文件。即一个仅包含以下内容的独立文件: 使用纯Python将这些文件的内容转换为等效于Python的数据结构的最佳方法是什么?目前,我们可以假设没有要评估的真实表达式,只有结构化数据。 问题答案: 不知道用例是什么。这是我的假设:您将要进行一次从Perl到Python的转换。 Perl有这个 在Python中, 所以,我想这是一堆可替换的RE

  • 问题内容: 对于以下C代码: 对于Win32,我得到以下反汇编: 对于Linux32: 我试图了解呼叫后呼叫者的行为方式的差异。为什么Linux32中的调用程序会执行这些额外的操作? 我假设两个目标都将遵循cdecl调用约定。cdecl不会为返回结构的函数定义调用约定吗? 编辑: 我添加了被调用者的实现。可以肯定的是,您可以看到Linux32被调用方会弹出其参数,而Win32被调用方不会: Win

  • 根据文件,结构如下: char*GR_NAME 组的名称。 /tmp#java-cp.:jna-4.5.1.jar测试root Hello,线程“main”java.lang.IllegalArgumentException:在com.sun.jna.pointer.ReadArray(pointer.java:538)在com.sun.jna.pointer.GetValue(pointer.j

  • 我正在linux 64bit中构建没有glibc的简单应用程序。但是我不知道如何获取参数。 我谷歌了一下,发现RDI是argc,RSI是argv。但它不起作用。 当_start函数开始使用gdb时,我看到了寄存器,但RDI和RSI都是0x0。我还用最简单的汇编应用程序进行了测试,但结果是一样的。RDI和RSI是0x0。我认为即使我没有向程序传递参数,argc也不应该是0x0。 这是我尝试过的C代码