【发布时间】:2021-03-20 22:00:31
【问题描述】:
我正在使用 java dbus 接口。由于它不完整,我们必须使用dbus自省工具生成xml文件,然后将其转换为Java类。
我希望能够在驱动器插入系统或从系统中移除时接收信号。
为此,我发现信号 InterfacesAdded 和 InterfacesRemoved 是我正在搜索的。
我已使用此命令生成 xml 内省文件:
gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2 --xml
它生成了一个文件,我用这个命令转换了它:
CreateInterface --system --no-ignore-builtin --create-files org.freedesktop.UDisks2.xml
我现在能够接收 InterfacesAdded 信号,但不能接收 InterfacesRemoved 信号。
似乎有问题,这个信号想要给出block_devices节点中的一些信息。但是对于这个节点,xml 文件是空的:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.66.2 -->
<node>
<interface name="org.freedesktop.DBus.Properties">
... snip ...
<interface name="org.freedesktop.DBus.ObjectManager">
<method name="GetManagedObjects">
<arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/>
</method>
<signal name="InterfacesAdded">
<arg type="o" name="object_path"/>
<arg type="a{sa{sv}}" name="interfaces_and_properties"/>
</signal>
<signal name="InterfacesRemoved">
<arg type="o" name="object_path"/>
<arg type="as" name="interfaces"/>
</signal>
</interface>
<node name="Manager"/>
<node name="drives"/>
<node name="block_devices"/>
</node>
因此,java 代码不知道如何创建信号。
我能做些什么呢?
【问题讨论】:
-
“这个信号想要给出block_devices节点中的一些信息”——你是怎么得出这个结论的?如果您使用的 java 工具无法处理额外的节点,请尝试手动将它们从 xml 中删除。
-
空节点不会被 CreateInterface 工具转置为类。所以从 xml 中删除它不会改变任何东西。我的结论来自异常:org.freedesktop.dbus.exceptions.DBusException: Failed to create proxy object for /org/freedesktop/UDisks2/block_devices/sdb export by :1.75。原因:找不到要转换的接口