QtJniTypes Namespace

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

Header: #include <QtJniTypes>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: 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_METHOD およびQ_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_METHOD およびQ_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_METHOD およびQ_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_METHOD およびQ_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も参照してください

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。