回调机制
简介
在使用 Java API 时,会有各种情况需要实现回调。实际示例包括通过 `ContentObserver` 监听内容变化的回调,以及实现 `Handler.Callback` 等 Java 接口的回调。
QtJenny 允许根据 Java API 的具体实现方式,通过实现 Java 接口或继承 Java 类来实现此类回调。Android 提供的许多跨平台 Java API 均采用接口形式的回调,但在某些情况下 Android 也会使用抽象基类,ContentObserver 便是其中一个典型的例子。
实现 Java 接口
下图说明了在 C++ 中实现 Java 接口的结构及其各部分之间的逻辑划分。
其工作原理是:我们使用一个java.reflect.Proxy (该类封装了Java接口),并将接口方法的调用分派给InvocationHandler 中的通用invoke() 方法。
InvocationHandler 接口由项目专用的NativeInvocationHandler (由您的应用程序提供)实现,该实现会调用同样由项目提供的通用本机调用方法。本机方法会调用生成C++类中模拟Java接口的通用qt_invoke() 虚函数。
最后,Qt C++ 项目中的用户代码继承该生成的类,并重写其中的虚拟函数。
扩展 Java 类
下图说明了在 C++ 中扩展 Java 类时,各部分的结构及其逻辑划分。
其工作原理是:我们生成一个 Java 子类,该子类随后调用NativeInvocationHandler 中的通用invoke() 方法,而 是一个由项目提供的 Java 类。
该NativeInvocationHandler 会调用一个同样由项目提供的通用本机调用方法。该本机方法会调用一个模拟该Java类的生成的C++类中,一个通用的qt_invoke() 虚函数。
最后,Qt C++ 项目中的用户代码继承了该生成的类,并重写了其中的虚函数。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.