このページでは

QtJniTypes Namespace

QtJniTypes 名前空間では、Java 型に対応する C++ 型が宣言されています。詳細...

ヘッダー: #include <QtJniTypes>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
以下のように: Qt 6.8

クラス

(since Qt 6.8) class JObject

マクロ

(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(JNI)フレームワークは、ネイティブのCまたはC++コードからJava APIを呼び出すことを可能にし、また、JavaコードがJVMを介して呼び出せるように、ネイティブのCまたはC++関数を登録することを可能にします。Qtでは、QJniObject 型およびQJniEnvironment 型が、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も参照してください 。

クラス

classJObject

QtJniTypes 名前空間にある JObject テンプレートは、宣言された Java 型の基底となります。詳細...

マクロのドキュメント

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

QtJniTypes 名前空間内で、Java クラスJavaSignature をラップする C++ 型Type を宣言します。JavaSignature 内の Java クラス名は、/ を区切り文字として使用し、完全修飾名で指定する必要があります。

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

その結果、C++ クラス `QtJniTypes::File ` および `QtJniTypes::FileWriter ` は、`QJniObject` と同様の型(正確には `QtJniTypes::JObject` の特化形)となり、これを使用して対応する Java クラスのインスタンスを作成したり、メソッドを呼び出したり、コンパイル時の自動シグネチャ推論を備えた `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_METHOD 、Q_JNI_NATIVE_METHOD 、およびQtJniTypes::JObjectも参照してください 。

[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)

以前はdeclared として定義されていたネイティブメソッドMethod (スコープScope )を、JNIフレームワークへの登録が可能にします。QJniEnvironment::registerNativeMethod() を使用してJNIにメソッドを登録する際は、このマクロを使用してください。

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

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

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