QJniObject Class
Java Native Interface(JNI)を簡単に利用できるラッパーです。詳細...
| ヘッダー: | #include <QJniObject> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 以下のように: | Qt 6.1 以降 |
パブリック関数
| QJniObject() | |
| QJniObject(const char *className) | |
| QJniObject(jclass clazz) | |
| QJniObject(jobject object) | |
(since 6.4) | QJniObject(const char *className, Args &&... args) |
(since 6.4) | QJniObject(jclass clazz, Args &&... args) |
| QJniObject(const char *className, const char *signature, ...) | |
| QJniObject(jclass clazz, const char *signature, ...) | |
| QJniObject(const QJniObject &other) | |
| QJniObject(QJniObject &&other) | |
| ~QJniObject() | |
(since 6.4) auto | callMethod(const char *methodName, Args &&... args) const |
(since 6.4) auto | callMethod(const char *methodName, const char *signature, Args &&... args) const |
(since 6.4) QJniObject | callObjectMethod(const char *methodName, Args &&... args) const |
| QJniObject | callObjectMethod(const char *methodName, const char *signature, ...) const |
(since 6.2) QByteArray | className() const |
| auto | getField(const char *fieldName) const |
| QJniObject | getObjectField(const char *fieldName) const |
| QJniObject | getObjectField(const char *fieldName, const char *signature) const |
| bool | isValid() const |
| jobject | object() const |
| T | object() const |
(since 6.2) jclass | objectClass() const |
| auto | setField(const char *fieldName, Type value) |
| auto | setField(const char *fieldName, const char *signature, Type value) |
(since 6.8) void | swap(QJniObject &other) |
| QString | toString() const |
| QJniObject & | operator=(QJniObject &&other) |
| QJniObject & | operator=(T object) |
| QJniObject & | operator=(const QJniObject &other) |
静的パブリックメンバー
(since 6.7) auto | callStaticMethod(const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, const char *methodName, Args &&... args) |
(since 6.4) auto | callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args) |
(since 6.4) auto | callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args) |
| auto | callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args) |
(since 6.4) QJniObject | callStaticObjectMethod(const char *className, const char *methodName, Args &&... args) |
(since 6.4) QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args) |
| QJniObject | callStaticObjectMethod(jclass clazz, jmethodID methodId, ...) |
| QJniObject | callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...) |
| QJniObject | callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...) |
(since 6.4) auto | construct(Args &&... args) |
| QJniObject | fromLocalRef(jobject localRef) |
| QJniObject | fromString(const QString &string) |
| auto | getStaticField(const char *fieldName) |
| auto | getStaticField(const char *className, const char *fieldName) |
| auto | getStaticField(jclass clazz, const char *fieldName) |
| QJniObject | getStaticObjectField(const char *className, const char *fieldName) |
| QJniObject | getStaticObjectField(jclass clazz, const char *fieldName) |
| QJniObject | getStaticObjectField(const char *className, const char *fieldName, const char *signature) |
| QJniObject | getStaticObjectField(jclass clazz, const char *fieldName, const char *signature) |
| bool | isClassAvailable(const char *className) |
| auto | setStaticField(const char *fieldName, Type value) |
| auto | setStaticField(const char *className, const char *fieldName, Type value) |
| auto | setStaticField(jclass clazz, const char *fieldName, Type value) |
| auto | setStaticField(const char *className, const char *fieldName, const char *signature, Type value) |
| auto | setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value) |
関連する非メンバー
| bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
| bool | operator==(const QJniObject &o1, const QJniObject &o2) |
詳細説明
QJniObjectクラスは、Javaオブジェクトへの参照をラップし、そのオブジェクトがガベージコレクションの対象とならないようにするとともに、JNIEnv のほとんどのメソッド呼び出し(メンバ、静的)およびフィールド(セッター、ゲッター)へのアクセスを提供します。これにより、通常、JNIを直接使用して各操作を行う際に必要となる多くの定型コードが不要になります。 呼び出されたJavaメソッドによってスローされた例外は、デフォルトではクリアされますが、Qt 6.11以降では呼び出し元で処理することも可能です。
注:このAPIは Androidでの使用を想定して設計・テストされています。他のプラットフォームでのテストは行われていません。
メソッドのシグネチャ
QJniObject は、指定された、あるいは推論されたテンプレート引数に基づいて正しいシグネチャを使用する便利関数を提供します。
jint x = QJniObject::callMethod<jint>("getSize");
QJniObject::callMethod<void>("touch");
jint ret = jString1.callMethod<jint>("compareToIgnoreCase", jString2.object<jstring>());これらの関数は可変引数テンプレートであり、コンパイラは実際の引数の型からシグネチャを推論します。明示的に指定する必要があるのは戻り値の型のみです。QJniObjectは、JNI types を引数とする関数や、QtJniTypes の型マッピングで宣言された型について、シグネチャ文字列を推論することができます。
// Java class
package org.qtproject.qt;
class TestClass
{
static TestClass create() { ... }
static String fromNumber(int x) { ... }
static String[] stringArray(String s1, String s2) { ... }
}// C++ code
Q_DECLARE_JNI_CLASS(TestClass, "org/qtproject/qt/TestClass")
// ...
using namespace QtJniTypes;
TestClass testClass = TestClass::callStaticMethod<TestClass>("create");これにより、JNIシグネチャ文字列を明示的に作成することなく、C++コード内で任意のJava型やAndroid型を扱うことが可能になります。
明示的なJNIシグネチャ
シグネチャを自分で指定することも可能です。その場合、シグネチャが呼び出したい関数と一致していることが重要です。
- クラス名は完全修飾名で指定する必要があります。例:
"java/lang/String"。 - メソッドのシグネチャは
"(ArgumentsTypes)ReturnType"の形式で記述します。詳細はJNI Types を参照してください。 - すべてのオブジェクト型は QJniObject として返されます。
以下の例は、さまざまな静的関数を呼び出す方法を示しています:
シグネチャの構造は `"(ArgumentsTypes)ReturnType"` です。シグネチャ内の配列型には `[ ` という接頭辞を付ける必要があり、完全修飾された `Object ` 型名には `L ` という接頭辞と `; ` という接尾辞を付ける必要があります。関数 `create ` のシグネチャは `"()Lorg/qtproject/qt/TestClass;` です。2番目と3番目の関数のシグネチャは、それぞれ `"(I)Ljava/lang/String;" ` および `"(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"` です。
create() 関数は、次のように呼び出すことができます:
// C++ code
QJniObject testClass = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
"create",
"()Lorg/qtproject/qt/TestClass;");2番目と3番目の関数については、QJniObjectのテンプレートメソッドを利用して暗黙的なシグネチャ文字列を作成することもできますが、シグネチャ文字列を明示的に渡すことも可能です:
// C++ code
QJniObject stringNumber = QJniObject::callStaticObjectMethod("org/qtproject/qt/TestClass",
"fromNumber",
"(I)Ljava/lang/String;", 10);暗黙的なシグネチャの作成を機能させるには、戻り値の型を明示的に指定する必要があります:
// C++ code
QJniObject string1 = QJniObject::fromString("String1");
QJniObject string2 = QJniObject::fromString("String2");
QJniObject stringArray = QJniObject::callStaticObjectMethod<jobjectArray>(
"org/qtproject/qt/TestClass",
"stringArray",
string1.object<jstring>(),
string2.object<jstring>());最初のテンプレートパラメータでJava関数の戻り値型を指定しても、メソッドは依然としてQJniObjectを返すことに注意してください。
Javaの例外の処理
例外をスローする可能性があるJava関数を呼び出した後は、処理を続行する前に、例外の有無を確認し、処理を行い、クリアすることが重要です。 すべての QJniObject 関数は、例外を報告およびクリアすることで、内部的に例外を処理することができます。これには、存在しないメソッドの呼び出しや、不正なパラメータの指定などによる JNI 例外が含まれます。また、エラーの報告や失敗情報の返却として、メソッドによって例外がスローされる場合もあります。
Qt 6.11 以降、クライアントコードは各呼び出しにおいて例外を明示的に処理するように設定できます。これを行うには、C++ 23 の `std::expected ` を戻り値の型として使用し、値の型を期待値として、`jthrowable ` をエラー型として指定します。 たとえば、android.provider.Settings.Secure 型を介して設定値を読み込もうとした場合、その設定が存在しないときは例外がスローされる可能性があります。
Q_DECLARE_JNI_CLASS(SettingsSecure, "android/provider/Settings$Secure")
using namespace QtJniTypes;
QString enabledInputMethods()
{
ContentResolver resolver;
SettingsSecure settings;
auto defaultInputMethods = settings.callMethod<std::expected<QString, jthrowable>>(
"getString", resolver, u"enabled_input_methods"_s
);
if (defaultInputMethods)
return defaultInputMethods.value();
QStringList stackTrace = QJniEnvironment::stackTrace(defaultInputMethods.error());
}std::expected と同様に振る舞う他の任意の型を使用できるため、C++23を使用せずに例外を明示的に処理することも可能です。唯一の要件は、その型がvalue_type 、error_type 、およびunexpected_type の3つのネストされた型を宣言しており、値型およびjthrowable を保持するunexpected_type から構築可能であることです。
注: JNIEnv を直接使用してJNI呼び出しを行う場合、ユーザーは 例外を手動で処理する必要があります。例外が保留中の状態で他のJNI呼び出しを行うことは安全ではありません。詳細については、QJniEnvironment::checkAndClearExceptions()を参照してください。
Javaネイティブメソッド
Javaネイティブメソッドを使用すると、Javaからネイティブコードを呼び出すことが可能になります。これは、Javaで関数宣言を作成し、その先頭にnative キーワードを付けることで実現されます。Javaからネイティブ関数を呼び出すには、まずJavaネイティブ関数をコード内のネイティブ関数にマッピングする必要があります。関数のマッピングは、QJniEnvironment::registerNativeMethods()を呼び出すことで行えます。
以下の例は、その方法を示しています。
Javaの実装:
class FooJavaClass
{
public static void foo(int x)
{
if (x < 100)
callNativeOne(x);
else
callNativeTwo(x);
}
private static native void callNativeOne(int x);
private static native void callNativeTwo(int x);
}C++ での実装:
static voidfromJavaOne(JNIEnv*env,jobject thiz,jint x)
{
Q_UNUSED(env);
Q_UNUSED(thiz);
qDebug() << x << "< 100";
}
static voidfromJavaTwo(JNIEnv*env,jobject thiz,jint x)
{
Q_UNUSED(env);
Q_UNUSED(thiz);
qDebug() << x << ">= 100";
}
voidfoo()
{
// まずネイティブメソッドを登録する。理想的にはアプリの起動時にこれを行うのが望ましい
constJNINativeMethod methods[] =
{{"callNativeOne", "(I)V", reinterpret_cast<void *>(fromJavaOne)},
{"callNativeTwo", "(I)V", reinterpret_cast<void *>(fromJavaTwo)}};
QJniEnvironment env;
env.registerNativeMethods("my/java/project/FooJavaClass",methods, 2);
// C++関数を呼び戻すJavaメソッドを呼び出す
QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10); // 出力: 10 < 100
QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100);// 出力: 100 >= 100
}Javaオブジェクトの存続期間
Java から受け取るほとんどの `objects ` はローカル参照であり、ネイティブメソッドから戻るまでしか有効ではありません。その後、そのオブジェクトはガベージコレクションの対象となります。ループ内で多数のローカル参照を作成する場合は、各反復ごとに手動でそれらを削除する必要があります。そうしないと、メモリ不足になる可能性があります。 詳細については、「JNI 設計の概要:グローバル参照とローカル参照」を参照してください。ネイティブメソッドのスコープ外で作成されたローカル参照は、AttachCurrentThread を使用しているため、ガベージコレクタによって自動的に解放されないため、手動で削除する必要があります。詳細については、「JNI のヒント:ローカル参照とグローバル参照」を参照してください。
Java オブジェクトを存続させたい場合は、そのオブジェクトへの新しいグローバル参照を作成して、使用終了時に解放するか、新しい QJniObject を生成して、その QJniObject に Java オブジェクトのライフタイム管理を任せる必要があります。
注: QJniObjectは 自身の参照のみを管理します。グローバル参照またはローカル参照から QJniObject を生成した場合、その参照は QJniObject によって解放されません。
JNI 型
オブジェクト型
| 型 | シグネチャ |
|---|---|
| jobject | Ljava/lang/Object; |
| jclass | Ljava/lang/Class; |
| jstring | Ljava/lang/String; |
| jthrowable | Ljava/lang/Throwable; |
| jobjectArray | [Ljava/lang/Object; |
| jarray | [<型> |
| jbooleanArray | [Z |
| jbyteArray | [B |
| jcharArray | [C |
| jshortArray | [S |
| jintArray | [I |
| jlongArray | [J |
| jfloatArray | [F |
| jdoubleArray | [D |
プリミティブ型
| 型 | シグネチャ |
|---|---|
| jboolean | Z |
| jbyte | B |
| jchar | C |
| jshort | S |
| jint | I |
| jlong | J |
| jfloat | F |
| jdouble | D |
その他
| タイプ | 署名 |
|---|---|
| void | V |
| カスタム型 | L<完全修飾名>; |
JNIの詳細については、『Java Native Interface Specification』を参照してください。
QJniEnvironment およびobject()も参照してください 。
メンバ関数のドキュメント
QJniObject::QJniObject()
無効なJNIオブジェクトを構築します。
isValid()も参照してください 。
[explicit] QJniObject::QJniObject(const char *className)
className のデフォルトコンストラクタを呼び出して、新しいJNIオブジェクトを生成します。
QJniObject myJavaString("java/lang/String");[explicit] QJniObject::QJniObject(jclass clazz)
clazz のデフォルトコンストラクタを呼び出し、新しいJNIオブジェクトを生成します。
注: QJniObjectは 、clazz クラスへの新しい参照を作成し、破棄時にその参照を解放します。QJniObject の外部で作成されたクラスへの参照は、呼び出し元が管理する必要があります。
QJniObject::QJniObject(jobject object)
Javaオブジェクト `object` を基に、新しいJNIオブジェクトを構築します。
注: QJniObject は Java オブジェクトobject への参照を保持し、破棄時にそれを解放します。QJniObject の外部にある Java オブジェクトobject への参照は、呼び出し元が管理する必要があります。ほとんどの場合、ローカル参照を自分で管理する意図がない限り、この関数をローカル参照で呼び出してはなりません。 ローカル参照を QJniObject に変換する方法については、QJniObject::fromLocalRef() を参照してください。
fromLocalRef()も参照してください 。
[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(const char *className, Args &&... args)
引数args を指定してclassName のコンストラクタを呼び出し、新しいJNIオブジェクトを生成します。このコンストラクタは、すべてのargs が判明している場合のみ利用可能です(JNI Types )。
QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", myJStringArg);この関数は Qt 6.4 で導入されました。
[explicit, since 6.4] template <typename... Args> QJniObject::QJniObject(jclass clazz, Args &&... args)
clazz から、引数args を指定してコンストラクタを呼び出すことで、新しい JNI オブジェクトを構築します。このコンストラクタは、すべてのargs が判明している場合のみ利用可能ですJNI Types 。
QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, 3);この関数は Qt 6.4 で導入されました。
[explicit] QJniObject::QJniObject(const char *className, const char *signature, ...)
`signature ` を使用して、後続の引数の型を指定しつつ、className のコンストラクタを呼び出し、新しい JNI オブジェクトを構築します。
QJniEnvironment env;
char* str = "Hello";
jstring myJStringArg = env->NewStringUTF(str);
QJniObject myNewJavaString("java/lang/String", "(Ljava/lang/String;)V", myJStringArg);[explicit] QJniObject::QJniObject(jclass clazz, const char *signature, ...)
`clazz ` から新しい JNI オブジェクトを生成します。これは、コンストラクタを呼び出し、`signature ` を使用して、その後の引数の型を指定します。
QJniEnvironment env;
jclass myClazz = env.findClass("org/qtproject/qt/TestClass");
QJniObject(myClazz, "(I)V", 3);[noexcept default] QJniObject::QJniObject(const QJniObject &other)
QJniObject のインスタンスをコピーして生成します。
[noexcept default] QJniObject::QJniObject(QJniObject &&other)
QJniObject のインスタンスをMoveコンストラクタで生成します。
[noexcept] QJniObject::~QJniObject()
JNI オブジェクトを破棄し、その JNI オブジェクトが保持している参照をすべて解放します。
[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const
引数args を指定してメソッドmethodName を呼び出し、値を返します(Retがvoid でない場合)。Retがjobject型の場合、返される値はQJniObject となります。
QJniObject myJavaString("org/qtproject/qt/TestClass");
jint size = myJavaString.callMethod<jint>("length");メソッドのシグネチャは、コンパイル時に Ret および `args` の型から推論されます。Ret は、値を返す `std::expected` 互換の型、または呼び出されるメソッドによって `any Java exception thrown ` となる型です。
この関数はQt 6.4で導入されました。
[since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const
オブジェクトのメソッド `methodName ` を、signature を引き数として呼び出し、後続の引数の型を `args` で指定し、値を返します(`Ret` が `void` でない場合)。`Ret` が `jobject` 型の場合、返される値は `QJniObject` になります。
QJniObject myJavaString("org/qtproject/qt/TestClass");
jint index = myJavaString.callMethod<jint>("indexOf", "(I)I", 0x0051);この関数は Qt 6.4 で導入されました。
[since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callObjectMethod(const char *methodName, Args &&... args) const
引数args を指定して、JavaオブジェクトのメソッドmethodName を呼び出し、返されたJavaオブジェクトに対する新しいQJniObject を返します。
QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");メソッドのシグネチャは、コンパイル時に `Ret` および `args` の型から推論されます。`Ret` は、値を返す `std::expected` と互換性のある型、または呼び出されるメソッドによって返される `any Java exception thrown ` である必要があります。
この関数は Qt 6.4 で導入されました。
QJniObject QJniObject::callObjectMethod(const char *methodName, const char *signature, ...) const
Java オブジェクトのメソッド `methodName ` を呼び出し、signature を使用して、その後に続く引数の型を指定します。
QJniObject myJavaString = QJniObject::fromString("Hello, Java");
QJniObject mySubstring = myJavaString.callObjectMethod("substring",
"(II)Ljava/lang/String;", 7, 11);[static, since 6.7] template <
typename Klass,
typename ReturnType = void,
typename... Args
>
auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
クラス `Klass ` の静的メソッド `methodName ` を呼び出し、`Ret` 型の値を返します(ただし、`Ret` が `void` の場合は除く)。`Ret` が `jobject` 型の場合、返される値は `QJniObject` になります。
メソッドのシグネチャは、Ret およびargs の型からコンパイル時に推論されます。Klass は、Java 型への登録済み型マッピングを持つ C++ 型である必要があります。Ret は、値を返すstd::expected 互換の型、または呼び出されるメソッドによって返されるany Java exception thrown であることができます。
この関数は Qt 6.7 で導入されました。
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, Args &&... args)
クラス `className ` の静的メソッド `methodName ` を、引数 `args` を渡して呼び出し、型 `Ret` の値を返します(ただし、`Ret` が `void` の場合は除く)。`Ret` が `jobject` 型の場合、返される値は `QJniObject` になります。
jint value = QJniObject::callStaticMethod<jint>("MyClass", "staticMethod");メソッドのシグネチャは、コンパイル時に Ret およびargs の型から推論されます。Ret は、値を返すstd::expected と互換性のある型、または呼び出されたメソッドによって指定されるany Java exception thrown である可能性があります。
この関数は Qt 6.4 で導入されました。
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, Args &&... args)
clazz に対して静的メソッド `methodName ` を呼び出し、Ret 型の値を返します(Ret が `void` である場合を除く)。Ret が jobject 型の場合、返される値は `QJniObject` になります。
QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jdouble randNr = QJniObject::callStaticMethod<jdouble>(javaMathClass, "random");メソッドのシグネチャは、コンパイル時に Ret およびargs の型から推論されます。Ret は、値を返すstd::expected 互換の型、または呼び出されるメソッドによってany Java exception thrown となる型です。
この関数は Qt 6.4 で導入されました。
[static, since 6.4] template <typename ReturnType = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, jmethodID methodId, Args &&... args)
クラス `clazz ` の `methodId ` で指定された静的メソッドを、後続の引数とともに呼び出し、`Ret` 型の値を返します(ただし、`Ret` が `void` の場合は除きます)。`Ret` が `jobject` 型の場合、返される値は `QJniObject` になります。
clazz およびmethodId が以前の操作で既にキャッシュされている場合に便利です。
QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jmethodID methodId = env.findStaticMethod(javaMathClass, "max", "(II)I");
if (methodId != 0) {
jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>(javaMathClass, methodId, a, b);
}この関数は Qt 6.4 で導入されました。
[static, since 6.4] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
クラス `className ` の静的メソッド `methodName ` を、signature を引き数として呼び出し、後続の引数の型をargs で指定します。メソッドの結果を返します(ただし、`Ret` が `void` の場合は除く)。`Ret` が `jobject` 型の場合、返される値は `QJniObject` になります。
jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);この関数は Qt 6.4 で導入されました。
[static] template <typename Ret = void, typename... Args> auto QJniObject::callStaticMethod(jclass clazz, const char *methodName, const char *signature, Args &&... args)
clazz から静的メソッド `methodName ` を呼び出し、signature を使用して、その後の引数の型を指定します。メソッドの結果を返します(ただし、Ret が `void` の場合は除く)。Ret が `jobject` 型の場合、返される値は `QJniObject` になります。
QJniEnvironment env;
jclass javaMathClass = env.findClass("java/lang/Math");
jint a = 2;
jint b = 4;
jint max = QJniObject::callStaticMethod<jint>(javaMathClass, "max", "(II)I", a, b);[static, since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, Args &&... args)
クラスclassName に対して、引数args を渡し、methodName を持つ静的メソッドを呼び出し、返されたJavaオブジェクトに対する新しいQJniObject を返します。
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");メソッドのシグネチャは、コンパイル時に `Ret` および `args` の型から推論されます。`Ret` は、値を返す `std::expected` 互換の型、または呼び出されるメソッドによって返される `any Java exception thrown ` です。
この関数は Qt 6.4 で導入されました。
[static, since 6.4] template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)
clazz に対して、methodName を含む静的メソッドを呼び出し、引数としてargs を渡し、返された Java オブジェクトに対する新しいQJniObject を返します。
この関数は Qt 6.4 で導入されました。
[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
クラス `clazz ` の `methodId ` で指定された静的メソッドを、その後に続く引数とともに呼び出します。以前の操作で `clazz ` および `methodId ` がすでにキャッシュされている場合に便利です。
QJniEnvironment env;
jclass clazz = env.findClass("java/lang/String");
jmethodID methodId = env.findStaticMethod(clazz, "valueOf", "(I)Ljava/lang/String;");
if (methodId != 0)
QJniObject str = QJniObject::callStaticObjectMethod(clazz, methodId, 10);[static] QJniObject QJniObject::callStaticObjectMethod(const char *className, const char *methodName, const char *signature, ...)
クラス `className ` の静的メソッド `methodName ` を呼び出し、signature を使用して、その後に続く引数の型を指定します。
QJniObject thread = QJniObject::callStaticObjectMethod("java/lang/Thread", "currentThread",
"()Ljava/lang/Thread;");
QJniObject string = QJniObject::callStaticObjectMethod("java/lang/String", "valueOf",
"(I)Ljava/lang/String;", 10);[static] QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, const char *signature, ...)
クラス `clazz ` の静的メソッド `methodName ` を、signature を使用して呼び出し、後続の引数の型を指定します。
[since 6.2] QByteArray QJniObject::className() const
QJniObject が保持するクラスオブジェクトの名前を、QByteArray として返します。
この関数は Qt 6.2 で導入されました。
[static, since 6.4] template <typename Class, typename... Args> auto QJniObject::construct(Args &&... args)
Class と同等の Java クラスのインスタンスを生成し、JNI オブジェクトを含むQJniObject を返します。args の引数は、Java のコンストラクタに渡されます。
QJniObject javaString = QJniObject::construct<jstring>();この関数は、すべての `args ` が既知の `JNI Types` である場合にのみ利用可能です。
この関数は Qt 6.4 で導入されました。
[static] QJniObject QJniObject::fromLocalRef(jobject localRef)
ローカル JNI 参照 `localRef` から `QJniObject ` を作成します。この関数は `localRef ` の所有権を取得し、戻り値の返却前にそれを解放します。
注: この関数は、ローカル JNIリファレンスに対してのみ呼び 出してください。たとえば、JNI 環境を介したほとんどの生の JNI 呼び出しは、Java オブジェクトへのローカルリファレンスを返します。
jobject localRef = env->GetObjectArrayElement(array, index);
QJniObject element = QJniObject::fromLocalRef(localRef);[static] QJniObject QJniObject::fromString(const QString &string)
QString string から Java 文字列を作成し、その文字列を保持するQJniObject を返します。
QString myQString = "QString";
QJniObject myJavaString = QJniObject::fromString(myQString);toString()も参照してください 。
template <typename Type> auto QJniObject::getField(const char *fieldName) const
フィールド「fieldName 」の値を取得します。
QJniObject volumeControl("org/qtproject/qt/TestClass");
jint fieldValue = volumeControl.getField<jint>("FIELD_NAME");template <typename T> QJniObject QJniObject::getObjectField(const char *fieldName) const
フィールド `fieldName` から JNI オブジェクトを取得します。
QJniObject field = jniObject.getObjectField<jstring>("FIELD_NAME");QJniObject QJniObject::getObjectField(const char *fieldName, const char *signature) const
`signature` を使用して、フィールド `fieldName ` から JNI オブジェクトを取得します。
注:この関数は 、テンプレート型を指定せずに使用できます。
QJniObject field = jniObject.getObjectField("FIELD_NAME", "Ljava/lang/String;");[static] template <typename Klass, typename T> auto QJniObject::getStaticField(const char *fieldName)
クラス `Klass` の静的フィールド `fieldName ` から値を取得します。
Klass Java 型への登録済み型マッピングを持つ C++ 型である必要があります。
[static] template <typename Type> auto QJniObject::getStaticField(const char *className, const char *fieldName)
クラス `className` の静的フィールド `fieldName ` から値を取得します。
[static] template <typename Type> auto QJniObject::getStaticField(jclass clazz, const char *fieldName)
clazz 上の静的フィールド `fieldName ` から値を取得します。
[static] template <typename T> QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName)
クラス `className` のフィールド `fieldName ` からオブジェクトを取得します。
QJniObject jobj = QJniObject::getStaticObjectField<jstring>("class/with/Fields", "FIELD_NAME");[static] template <typename T> QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName)
clazz の「fieldName 」フィールドからオブジェクトを取得します。
QJniObject jobj = QJniObject::getStaticObjectField<jstring>(clazz, "FIELD_NAME");[static] QJniObject QJniObject::getStaticObjectField(const char *className, const char *fieldName, const char *signature)
クラス `className` のフィールド `fieldName ` から、`signature ` を持つ JNI オブジェクトを取得します。
注:この関数は 、テンプレート型を指定せずに使用できます。
QJniObject jobj = QJniObject::getStaticObjectField("class/with/Fields", "FIELD_NAME",
"Ljava/lang/String;");[static] QJniObject QJniObject::getStaticObjectField(jclass clazz, const char *fieldName, const char *signature)
クラス `clazz` のフィールド `fieldName ` から、signature を持つ JNI オブジェクトを取得します。
注:この関数は 、テンプレート型を指定せずに使用できます。
QJniObject jobj = QJniObject::getStaticObjectField(clazz, "FIELD_NAME", "Ljava/lang/String;");[static] bool QJniObject::isClassAvailable(const char *className)
Javaクラス「className 」が利用可能な場合、trueを返します。
if (QJniObject::isClassAvailable("java/lang/String")) {
// condition statement
}bool QJniObject::isValid() const
このインスタンスが有効な Java オブジェクトを保持している場合、true を返します。
QJniObject qjniObject; // ==> isValid() == false
QJniObject qjniObject(0) // ==> isValid() == false
QJniObject qjniObject("could/not/find/Class") // ==> isValid() == falseQJniObject が保持するオブジェクトを、jobject または型 T のいずれかとして返します。T は、JNI Object Types のいずれかになります。
QJniObject string = QJniObject::fromString("Hello, JNI");
jstring jstring = string.object<jstring>();注: 返されたオブジェクトは 、このQJniObject によって引き続き保持されます。このQJniObject の存続期間を超えてオブジェクトを維持したい場合(例えば、後で使用するために記録しておく場合など)、最も簡単な方法は、適切な存続期間を持つ別のQJniObject にオブジェクトを格納することです。あるいは、オブジェクトへの新しいグローバル参照を作成して格納し、使用が終了したら解放するように注意を払うこともできます。
void functionScope()
{
QString helloString("Hello");
jstring myJString = 0;
{
QJniObject string = QJniObject::fromString(helloString);
myJString = string.object<jstring>();
}
// Ops! myJString is no longer valid.
QString myQtString = QJniObject(myJString).toString();
}[since 6.2] jclass QJniObject::objectClass() const
QJniObject が保持するクラスオブジェクトを、jclass として返します。
注: 返されたオブジェクトは 、このQJniObject によって引き続き保持されます。このQJniObject のライフタイムを超えてオブジェクトを存続させる場合(例えば、後で使用するために記録しておく場合など)、最も簡単な方法は、適切なライフタイムを持つ別のQJniObject にオブジェクトを格納することです。あるいは、オブジェクトへの新しいグローバル参照を作成して格納し、使用が終了したら解放するように注意することもできます。
この関数は Qt 6.2 で導入されました。
template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, Type value)
fieldName の値をvalue に設定します。
QJniObject obj;
obj.setField<jint>("AN_INT_FIELD", 10);
jstring myString = ...;
obj.setField<jstring>("A_STRING_FIELD", myString);template <typename Ret = void, typename Type> auto QJniObject::setField(const char *fieldName, const char *signature, Type value)
`signature ` を使用して、fieldName の値を `value` に設定します。
QJniObject stringArray = ...;
QJniObject obj = ...;
obj.setObjectField<jobjectArray>("KEY_VALUES", "([Ljava/lang/String;)V",
stringArray.object<jobjectArray>())[static] template <
typename Klass,
typename Ret = void,
typename Type
>
auto QJniObject::setStaticField(const char *fieldName, Type value)
クラス `Klass ` の静的フィールド `fieldName ` を `value` に設定します。
Klass Java型へのマッピングが登録されたC++型である必要があります。
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, Type value)
クラス `className ` の静的フィールド `fieldName ` を `value` に設定します。
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, Type value)
クラス `clazz ` の静的フィールド `fieldName ` を `value` に設定します。
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, Type value)
クラス `className ` の静的フィールド `fieldName ` を、signature を使用したセッターを用いて `value ` に設定します。
[static] template <typename Ret = void, typename Type> auto QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, Type value)
クラス `clazz ` の静的フィールド `fieldName ` を、signature を使用したセッターを用いて `value ` に設定します。
[noexcept, since 6.8] void QJniObject::swap(QJniObject &other)
このオブジェクトをother と交換します。この操作は非常に高速で、失敗することはありません。
この関数は Qt 6.8 で導入されました。
QString QJniObject::toString() const
Javaオブジェクトの文字列表現を含むQString を返します。JavaのStringオブジェクトに対してこの関数を呼び出すと、実際の文字列データを取得するのに便利です。
QJniObject string = ...; // "Hello Java"
QString qstring = string.toString(); // "Hello Java"fromString()も参照してください 。
[noexcept default] QJniObject &QJniObject::operator=(QJniObject &&other)
other をこのQJniObject インスタンスに割り当てます。
template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)
現在のオブジェクトを `object` に置き換えます。元の Java オブジェクトは解放されます。
[noexcept default] QJniObject &QJniObject::operator=(const QJniObject &other)
other をこのQJniObject インスタンスにコピーして割り当てます。
関連する非メンバー
bool operator!=(const QJniObject &o1, const QJniObject &o2)
o1 がo2 とは異なるオブジェクトへの参照を保持している場合、true を返します。
bool operator==(const QJniObject &o1, const QJniObject &o2)
o1 とo2 の両方が同じ Java オブジェクトを参照している場合、または両方が NULL の場合、true を返します。それ以外の場合は false が返されます。
© 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.