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() | |
(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 |
void | setField(const char *fieldName, T value) |
void | setField(const char *fieldName, const char *signature, T value) |
(since 6.8) void | swap(QJniObject &other) |
QString | toString() const |
QJniObject & | operator=(T object) |
静的パブリックメンバー
(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) QJniObject | 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, T value) |
void | setStaticField(const char *className, const char *fieldName, T value) |
void | setStaticField(jclass clazz, const char *fieldName, T value) |
void | setStaticField(const char *className, const char *fieldName, const char *signature, T value) |
void | setStaticField(jclass clazz, const char *fieldName, const char *signature, T value) |
関連非会員
bool | operator!=(const QJniObject &o1, const QJniObject &o2) |
bool | operator==(const QJniObject &o1, const QJniObject &o2) |
詳細説明
QJniObjectクラスはJavaオブジェクトへの参照をラップし、ガベージコレクションされないようにし、ほとんどのJNIEnv
メソッド呼び出し(メンバー、スタティック)とフィールド(セッター、ゲッター)へのアクセスを提供します。これは、例外処理を含むすべての操作に対して、JNIに直接アクセスすることで、通常必要とされる多くのボイラープレートを排除します。
注: この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"
。 - JNI Typesメソッドのシグネチャは
"(ArgumentsTypes)ReturnType"
のように記述します。 - すべてのオブジェクト・タイプは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関数は、例外を報告してクリアすることによって内部的に例外を処理し、クライアント・コードで例外を処理する必要性を省きます。
注意: 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)}}; QJniEnvironmentenv; 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 tipsを参照してください:ローカル参照とグローバル参照。
Javaオブジェクトを存続させたい場合は、オブジェクトへの新しいグローバル参照を作成し、終了時にそれを解放するか、新しいQJniObjectを構築し、Javaオブジェクトの寿命を管理させる必要があります。
注意: QJniObject はそれ自身の参照のみを管理します。グローバル参照またはローカル参照から QJniObject を構築した場合、その参照は QJniObject によって解放されません。
JNIタイプ
オブジェクト型
タイプ | シグネチャ |
---|---|
ジョブジェクト | Ljava/lang/オブジェクト; |
jclass | Ljava/lang/Class; |
jstring | Ljava/lang/String; |
jthrowable | Ljava/lang/Throwable; |
jobject配列 | [Ljava/lang/Object; |
jarray | [<type> |
jboolean配列 | [Z |
jbyte配列 | [B |
jchar配列 | [C |
jshort配列 | [S |
jint配列 | [I |
jlong配列 | [J |
jfloat配列 | [F |
jdouble配列 | [D |
プリミティブ型
型 | シグネチャ |
---|---|
jboolean | Z |
バイト | B |
jchar | C |
jショート | S |
jint | I |
jlong | J |
jfloat | F |
jdouble | D |
その他
タイプ | 署名 |
---|---|
無効 | V |
カスタム型 | L<fully-qualified-name>; |
JNIの詳細については、Java Native Interface Specificationを参照のこと。
QJniEnvironment およびobject()も参照のこと 。
メンバ関数のドキュメント
QJniObject が保持するオブジェクトを 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. }
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)
args を引数としてコンストラクタを呼び出すことにより、clazz から新しい 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, ...)
className のコンストラクタを、signature で後続の引数の型を指定して呼び出すことで、新しい 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, ...)
signature でコンストラクタを呼び出して、clazz から新しい JNI オブジェクトを構築する。
QJniEnvironment env; jclass myClazz = env.findClass("org/qtproject/qt/TestClass"); QJniObject(myClazz, "(I)V", 3);
[noexcept]
QJniObject::~QJniObject()
JNIオブジェクトを破棄し、JNIオブジェクトが保持している参照をすべて解放する。
[since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, Args &&... args) const
メソッドmethodName を引数args で呼び出し、その値を返す(ただしRet
がvoid
である場合を除く)。Ret
が jobject 型の場合、返される値はQJniObject となる。
QJniObject myJavaString("org/qtproject/qt/TestClass"); jint size = myJavaString.callMethod<jint>("length");
メソッドのシグネチャは、コンパイル時にRet
とargs の型から推測されます。
この関数は Qt 6.4 で導入されました。
[since 6.4]
template <typename Ret, typename... Args> auto QJniObject::callMethod(const char *methodName, const char *signature, Args &&... args) const
signature でオブジェクトのメソッドmethodName を呼び出し、それに続く引数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
JavaオブジェクトのメソッドmethodName を引数args で呼び出し、返されたJavaオブジェクトの新しいQJniObject を返す。
QJniObject myJavaString = QJniObject::fromString("Hello, Java"); QJniObject myJavaString2 = myJavaString1.callObjectMethod<jstring>("toString");
メソッドのシグネチャは、コンパイル時にRet
とargs の型から推測されます。
この関数は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 Ret, typename... Args> auto QJniObject::callStaticMethod(const char *methodName, Args &&... args)
クラスKlass
のスタティック・メソッドmethodName を呼び出し、型Ret
の値を返す(ただしRet
がvoid
である場合を除く)。Ret
が jobject 型の場合、返される値はQJniObject となる。
メソッド・シグネチャは、コンパイル時にRet
とargs の型から推測されます。Klass
は、Java 型への型マッピングが登録された C++ 型である必要があります。
この関数はQt 6.7で導入されました。
[static, since 6.4]
template <typename Ret, 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 の型から推測されます。
この関数は Qt 6.4 で導入されました。
[static, since 6.4]
template <typename Ret, 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 の型から推測されます。
この関数は Qt 6.4 で導入されました。
[static, since 6.4]
template <typename Ret, 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, typename... Args> auto QJniObject::callStaticMethod(const char *className, const char *methodName, const char *signature, Args &&... args)
signature に続く引数args の型を指定して、クラスclassName から静的メソッドmethodName を呼び出す。メソッドの結果を返す(ただし、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, 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)
引数args を渡して、クラスclassName 上の静的メソッドmethodName を呼び出し、返されたJavaオブジェクトに対して新しいQJniObject を返す。
QJniObject string = QJniObject::callStaticObjectMethod<jstring>("CustomClass", "getClassName");
メソッド・シグネチャは、コンパイル時にRet
とargs の型から推測されます。
この関数は Qt 6.4 で導入されました。
[static, since 6.4]
template <typename Ret, typename... Args> QJniObject QJniObject::callStaticObjectMethod(jclass clazz, const char *methodName, Args &&... args)
引数args を渡し、methodName を持つ静的メソッドをclazz で呼び出し、返された 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, ...)
signature 、それに続く引数の型を指定して、className クラスからスタティック・メソッドmethodName を呼び出す。
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, ...)
signature 、後続の引数の型を指定して、clazz クラスからスタティック・メソッドmethodName を呼び出す。
[since 6.2]
QByteArray QJniObject::className() const
QJniObject が保持するクラスオブジェクトの名前をQByteArray
として返します。
この関数は Qt 6.2 で導入されました。
[static, since 6.4]
template <typename Class, typename... Args> QJniObject 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 T> 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
フィールドfieldName から JNI オブジェクトをsignature で取得します。
注意: この関数は、テンプレート・タイプがなくても使用できます。
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 T> auto QJniObject::getStaticField(const char *className, const char *fieldName)
クラスclassName の静的フィールドfieldName から値を取得します。
[static]
template <typename T> 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 からsignature を持つフィールドfieldName から 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 からsignature を持つフィールドfieldName から 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() == false
[since 6.2]
jclass QJniObject::objectClass() const
QJniObject が保持するクラス・オブジェクトをjclass
として返す。
注意: 返されたオブジェクトは、このQJniObject によってまだ生きています。このQJniObject の有効期間を超えてオブジェクトを保持し続けるには、例えば、後で使用するために記録する場合、最も簡単な方法は、適切な有効期間を持つ別のQJniObject に格納することです。あるいは、オブジェクトへの新しいグローバル参照を作成し、それを保存することもできます。
この関数はQt 6.2で導入されました。
template <typename T> void QJniObject::setField(const char *fieldName, T value)
fieldName の値をvalue に設定する。
QJniObject obj; obj.setField<jint>("AN_INT_FIELD", 10); jstring myString = ...; obj.setField<jstring>("A_STRING_FIELD", myString);
template <typename T> void QJniObject::setField(const char *fieldName, const char *signature, T 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 T> auto QJniObject::setStaticField(const char *fieldName, T value)
クラスKlass
の静的フィールドfieldName をvalue に設定します。
Klass
は、Java型への型マッピングが登録されたC++型である必要があります。
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, T value)
クラスclassName の静的フィールドfieldName をvalue に設定する。
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, T value)
クラスclazz の静的フィールドfieldName をvalue に設定する。
[static]
template <typename T> void QJniObject::setStaticField(const char *className, const char *fieldName, const char *signature, T value)
クラスclassName の静的フィールドfieldName を、signature のセッターを使ってvalue に設定します。
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, T 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()も参照 。
template <typename T, std::enable_if_t<std::is_convertible_v<T, jobject>, bool> = true> QJniObject &QJniObject::operator=(T object)
現在のオブジェクトをobject で置き換える。古いJavaオブジェクトはリリースされる。
関連する非会員
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が返される。
© 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.