コールバックの仕組み
はじめに
Java APIを使用する際、コールバックを実装する必要がある状況は多岐にわたります。その実用的な例としては、ContentObserver を介してコンテンツの変更を監視するコールバックや、Handler.Callback などのJavaインターフェースを実装するコールバックが挙げられます。
QtJennyでは、Java APIがどのような方式を採用しているかに応じて、Javaインターフェースを実装する場合も、Javaクラスを継承する場合も、いずれの場合でも、このようなコールバックを実装することができます。Androidでも提供されているクロスプラットフォームのJava APIの多くは、インターフェース形式のコールバックを使用していますが、Androidでは状況によっては抽象基底クラスを使用することもあり、その代表的な例がContentObserver です。
Javaインターフェースの実装
次の図は、C++でJavaインターフェースを実装する際の構造と、各部分の論理的な区分を示しています。
その仕組みは、Javaインターフェースをラップするjava.reflect.Proxy を使用し、インターフェースメソッドへの呼び出しを、InvocationHandler の汎用メソッドinvoke() にディスパッチするというものです。
InvocationHandler インターフェースは、プロジェクト固有のNativeInvocationHandler (アプリケーション側で提供)によって実装され、その実装は、同じくプロジェクト側で提供されるネイティブの汎用呼び出しメソッドを呼び出します。ネイティブメソッドは、Javaインターフェースを模倣した生成済みC++クラス内の汎用qt_invoke() 仮想関数を呼び出します。
最後に、Qt C++ プロジェクト内のユーザーコードは、その生成されたクラスを継承し、その中の仮想関数をオーバーライドします。
Javaクラスの拡張
次の図は、C++ での Java クラスの拡張における構造と、各部分の論理的な区分を示しています。
その仕組みは、Java サブクラスを生成し、そのサブクラスが、プロジェクトによって提供される Java クラスである `NativeInvocationHandler` の汎用 `invoke() ` メソッドを呼び出すというものです。
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.