このページでは

コールバックの仕組み

はじめに

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のサブクラスを生成し、そのサブクラスが、Qt C++のサブクラスの汎用メソッド(invoke() )を呼び出します。NativeInvocationHandler], which is a project-supplied Java class. The \c {NativeInvocationHandler} calls a native generic invocation method that is also project-supplied. The native method calls a generic \c {qt_invoke()} virtual function in a generated C++ class that mimics the Java class. Finally, the user code in the Qt C++ project inherits that generated class, and overrides the virtual functions in it.

© 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.