QtJniTypes Namespace

The QtJniTypes namespace declares C++ types that correspond to Java types. More...

Header: #include <QtJniTypes>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: Qt 6.8

Macros

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

Detailed Description

The Java Native Interface framework enables native C or C++ code to call Java APIs, and to register native C or C++ functions that Java code should be able to call with the JVM. In Qt, the QJniObject and QJniEnvironment types provide convenient wrappers for using JNI.

Since the Java language, similar to C++, supports overloading, functions need to be specified including their entire signature string. This is complex, repetitive, and error prone, especially when functions take several parameters. QJniObject provides variadic template APIs that can deduce the signature string for a function call at compile time, based on the C++ types passed into the template. For this to work, the mapping of those C++ types to their corresponding JNI string needs to be known at compile time.

Qt implements this mapping for the standard JNI types. By using the Q_DECLARE_JNI_CLASS macro, the mapping can be extended for arbitrary Java types.

See also Q_DECLARE_JNI_CLASS, Q_DECLARE_JNI_NATIVE_METHOD, and Q_JNI_NATIVE_METHOD.

Macro Documentation

[since 6.8] Q_DECLARE_JNI_CLASS(Type, JavaSignature)

Declares a C++ type Type in the QtJniTypes namespace that wraps the Java class JavaSignature. The Java class name in JavaSignature needs to be fully qualified, using / as the separator.

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

The C++ classes QtJniTypes::File and QtJniTypes::FileWriter are then QJniObject-like types that can be used to instantiate the corresponding Java class, to call methods, and to pass such instances through QJniObject variadic template methods with automatic, compile-time signature deduction.

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);
}

In addition to the QJniObject API, those C++ classes also have a static registerNativeMethods member function that can be used like this:

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

This macro was introduced in Qt 6.8.

See also Q_DECLARE_JNI_NATIVE_METHOD and Q_JNI_NATIVE_METHOD.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method)

Declares the free C or C++ function Method as a native method. The method can later be registered with the JNI framework using QJniEnvironment::registerNativeMethod() with the help of the Q_JNI_NATIVE_METHOD macro.

// 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);
}

This macro was introduced in Qt 6.8.

See also Q_JNI_NATIVE_METHOD and Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD(Method, JavaName)

This is an overloaded function.

Declares the free C or C++ function Method as a native method that's available in Java as JavaName. The method can later be registered with the JNI framework using QJniEnvironment::registerNativeMethod() with the help of the Q_JNI_NATIVE_METHOD macro.

This macro was introduced in Qt 6.8.

See also Q_JNI_NATIVE_METHOD and Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method)

Declares the C++ static class member function Method as a native method. The method can later be registered with the JNI framework using QJniEnvironment::registerNativeMethod() with the help of the Q_JNI_NATIVE_SCOPED_METHOD macro.

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)
});

This macro was introduced in Qt 6.8.

See also Q_DECLARE_JNI_NATIVE_METHOD and Q_JNI_NATIVE_SCOPED_METHOD.

[since 6.8] Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(Method, JavaName)

This is an overloaded function.

Declares the C++ static class member function Method as a native method that's available in Java as JavaName. The method can later be registered with the JNI framework using QJniEnvironment::registerNativeMethod() with the help of the Q_JNI_NATIVE_METHOD macro.

This macro was introduced in Qt 6.8.

See also Q_DECLARE_JNI_NATIVE_METHOD and Q_JNI_NATIVE_SCOPED_METHOD.

[since 6.8] Q_JNI_NATIVE_METHOD(Method)

Makes the previously declared native method Method available for registration with the JNI framework. Use this macro when registering the method with JNI using QJniEnvironment::registerNativeMethod().

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

This macro was introduced in Qt 6.8.

See also Q_DECLARE_JNI_NATIVE_METHOD.

[since 6.8] Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)

Makes the previously declared native method Method in scope Scope available for registration with the JNI framework. Use this macro when registering the method with JNI using QJniEnvironment::registerNativeMethod().

This macro was introduced in Qt 6.8.

See also Q_JNI_NATIVE_METHOD and Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE.

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