微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回 GObject 指针的抽象类型中的虚函数是不可内省的

如何解决返回 GObject 指针的抽象类型中的虚函数是不可内省的

我在玩 libpeas 时偶然发现了 gobject-introspection 工作方式的问题。

libpeas 中有一个类型叫做 PluginLoader(参见 here)。

一个名为 create_extension方法返回 PeasExtension *,它是一个指向 GObject 的点。当我将此类型添加到 gobject-introspection 并检查此方法生成 GIR 文件时,我可以看到它被标记introspectable="0"

<field name="create_extension" introspectable="0">
<callback name="create_extension" introspectable="0">
  <source-position filename="../libpeas/peas-plugin-loader.h"
                   line="60"/>
  <return-value>
    <type name="Extension" c:type="PeasExtension*"/>
  </return-value>
  <parameters>
    <parameter name="loader" transfer-ownership="none">
      <type name="PluginLoader" c:type="PeasPluginLoader*"/>
    </parameter>
    <parameter name="info" transfer-ownership="none">
      <type name="PluginInfo" c:type="PeasPluginInfo*"/>
    </parameter>
    <parameter name="ext_type" transfer-ownership="none">
      <type name="GType" c:type="GType"/>
    </parameter>
    <parameter name="n_parameters" transfer-ownership="none">
      <type name="guint" c:type="guint"/>
    </parameter>
    <parameter name="parameters" transfer-ownership="none">
      <type name="GObject.Parameter" c:type="GParameter*"/>
    </parameter>
  </parameters>
</callback>
</field>

当我将返回值更改为 void * 并重新编译时,introspectable="0" 属性从 GIR 文件中消失了。如果我将其更改为 GObject *,则 introspectable="0" 属性仍然存在。

当它返回一个 GObject 的实例(一个指针)时,它看起来像是不可内省的。但我不明白为什么?

通过阅读 gobject introspection 文档,看起来返回 GObject 实例是一个有效的用例。也许这与 PluginLoader 类型是抽象的而这是一个方法有关?

在不改变方法签名的情况下,任何注解都可以帮助使这个对象自省吗?

解决方法

在 Philip 在评论中的帮助下,我设法解决了这个问题。

g-ir-scanner 的输出中实际上有一条消息说:

../../source/libpeas/libpeas/peas-plugin-loader.h:91: Warning: Peas: peas_plugin_loader_create_extension: return value: Missing (transfer) annotation

通过这条消息,我了解到要使虚函数 create_extension 内省,我必须添加注释,但不是在 PeasPluginLoaderClass 定义中的函数指针处,而是在访问器函数 {{1 }}。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?