QtJniTypes Namespace

QtJniTypes 名前空間は、Java の型に対応する C++ の型を宣言します。詳細...

ヘッダー #include <QtJniTypes>
QtJniTypes 名前空間は、Java の型に対応する C++ の型を宣言します: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
以来:Qt 6.8

マクロ

(since 6.8) Q_DECLARE_JNI_CLASS(Type, JavaSignature)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)
(since 6.8) Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)
(since 6.8) Q_JNI_NATIVE_METHOD(Method)
(since 6.8) Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

詳しい説明

Java Native Interfaceフレームワークは、ネイティブCまたはC++コードがJava APIを呼び出したり、JavaコードがJVMで呼び出すことができるはずのネイティブCまたはC++関数を登録したりすることを可能にします。Qtでは、QJniObjectQJniEnvironment タイプが、JNIを使用するための便利なラッパーを提供します。

Java言語は、C++と同様にオーバーロードをサポートしているため、シグネチャ文字列全体を含めて関数を指定する必要があります。これは複雑で、繰り返しが多く、特に関数が複数のパラメータを取る場合、エラーが発生しやすい。QJniObject は、テンプレートに渡されたC++型に基づいて、コンパイル時に関数呼び出しのシグネチャ文字列を推測できる、可変テンプレートAPIを提供する。これが機能するためには、これらのC++型と対応するJNI文字列のマッピングがコンパイル時に分かっている必要があります。

Qt では、このマッピングを標準のJNI types に対して実装しています。Q_DECLARE_JNI_CLASS マクロを使用することで、マッピングを任意のJava型用に拡張することができます。

Q_DECLARE_JNI_CLASS,Q_DECLARE_JNI_NATIVE_METHOD,Q_JNI_NATIVE_METHODも参照して ください。

マクロ・ドキュメント

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

Java クラスJavaSignature をラップする C++ 型TypeQtJniTypes 名前空間で宣言します。JavaSignature の Java クラス名は、/ をセパレータとして完全修飾する必要があります。

Q_DECLARE_JNI_CLASS(File, "java/io/File")
Q_DECLARE_JNI_CLASS(FileWriter, "java/io/FileWriter")

C++ クラスQtJniTypes::FileQtJniTypes::FileWriter は、対応する Java クラスをインスタンス化したり、メソッドを呼び出したり、自動的なコンパイル時シグニチャ推論でQJniObject 変数テンプレート・メソッドを通してそのようなインスタンスを渡したりするために使用できるQJniObject ライクな型です。

using namespace QtJniTypes;

File file("path/to/file"); // instantiates the java.io.File type in Java
if (file.callMethod<bool>("createNewFile")) {
    FileWriter writer(file); // instantiates a java.io.FileWriter that operates on file
    writer.callMethod("write", 42);
}

QJniObject API に加えて、これらの C++ クラスは、このように使用できる静的メンバ関数registerNativeMethods も持っています:

QtJniTypes::File::registerNativeMethods({
    Q_JNI_NATIVE_METHOD(freeFunction)
});

このマクロは Qt 6.8 で導入されました。

Q_DECLARE_JNI_NATIVE_METHODQ_JNI_NATIVE_METHODも参照して ください。

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method)

フリーの C または C++ 関数Method をネイティブ・メソッドとして宣言します。このメソッドは後で、Q_JNI_NATIVE_METHOD マクロの助けを借りて、QJniEnvironment::registerNativeMethod() を使用して JNI フレームワークに登録できます。

// C++ side

Q_DECLARE_JNI_CLASS(MyJavaType, "my/java/Type")

static void nativeFunction(JNIEnv *env, jobject thiz, jlong id)
{
    // ...
}
Q_DECLARE_JNI_NATIVE_METHOD(nativeFunction)

Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    QJniEnvironment env;
    env.registerNativeMethods<QtJniTypes::MyJavaType>({
        Q_JNI_NATIVE_METHOD(nativeFunction)
    });
}

// Java side
public class MyJavaType
{
    native public nativeFunction(long id);
}

このマクロは Qt 6.8 で導入されました。

Q_JNI_NATIVE_METHODQ_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPEも参照して ください。

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)

これはオーバーロードされた関数である。

フリーの C または C++ 関数Method を、Java でJavaName として利用可能なネイティブ・メソッドとして宣言します。このメソッドは後で、Q_JNI_NATIVE_METHOD マクロの助けを借りて、QJniEnvironment::registerNativeMethod() を使用して JNI フレームワークに登録できます。

このマクロはQt 6.8で導入されました。

Q_JNI_NATIVE_METHODQ_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPEも参照してください

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)

C++ 静的クラス・メンバ関数Method をネイティブ・メソッドとして宣言します。このメソッドは後で、Q_JNI_NATIVE_SCOPED_METHOD マクロの助けを借りて、QJniEnvironment::registerNativeMethod() を使用して JNI フレームワークに登録できます。

class NativeHandler
{
    // ...
private:
    static void handleChange(JNIEnv*, jobject, jlong id);
    Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(handleChange)
};

\dots
QJniEnvironment env;
env.registerNativeMethods<QtJniTypes::MyJavaType>({
    Q_JNI_NATIVE_SCOPED_METHOD(handleChange, NativeHandler)
});

このマクロは Qt 6.8 で導入されました。

Q_DECLARE_JNI_NATIVE_METHODQ_JNI_NATIVE_SCOPED_METHODも参照して ください。

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)

これはオーバーロードされた関数である。

C++ 静的クラス・メンバ関数Method を、Java でJavaName として利用可能なネイティブ・メソッドとして宣言します。このメソッドは後で、Q_JNI_NATIVE_METHOD マクロの助けを借りて、QJniEnvironment::registerNativeMethod() を使用して JNI フレームワークに登録できます。

このマクロはQt 6.8で導入されました。

Q_DECLARE_JNI_NATIVE_METHODQ_JNI_NATIVE_SCOPED_METHODも参照してください

[since 6.8] Q_JNI_NATIVE_METHOD(Method)

以前にdeclared ネイティブメソッドMethod を JNI フレームワークで登録できるようにします。このマクロは、QJniEnvironment::registerNativeMethod() を使用して JNI にメソッドを登録するときに使用します。

Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    QJniEnvironment env;
    env.registerNativeMethods<QtJniTypes::MyJavaType>({
        Q_JNI_NATIVE_METHOD(nativeFunction)
    });
}

このマクロは Qt 6.8 で導入されました。

Q_DECLARE_JNI_NATIVE_METHODも参照してください

[since 6.8] Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

スコープScopedeclared ネイティブメソッドMethod を JNI フレームワークに登録できるようにします。このマクロは、QJniEnvironment::registerNativeMethod() を使用して JNI にメソッドを登録するときに使用します。

このマクロは Qt 6.8 で導入されました。

Q_JNI_NATIVE_METHOD およびQ_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPEも参照してください

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