QJniObject Class
Java Native Interface (JNI) の便利なラッパーです。詳細...
Header: | #include <QJniObject> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Since: | 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 void fromJavaOne(JNIEnv *env, jobject thiz, jint x) { Q_UNUSED(env); Q_UNUSED(thiz); qDebug() << x << "< 100"; } static void fromJavaTwo(JNIEnv *env, jobject thiz, jint x) { Q_UNUSED(env); Q_UNUSED(thiz); qDebug() << x << ">= 100"; } void foo() { // register the native methods first, ideally it better be done with the app start const JNINativeMethod 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); // Call the java method which will calls back to the C++ functions QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 10); // Output: 10 < 100 QJniObject::callStaticMethod<void>("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Output: 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<完全に修飾された名前>; |
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, ...)
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, ...)
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
引数args でメソッドmethodName を呼び出し、その値を返す(ただし、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
この関数は Qt 6.4 で導入されました。args に続く引数の型を指定するsignature でオブジェクトのメソッドmethodName を呼び出し、その値を返します(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)
この関数は Qt 6.4 で導入されました。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)
クラスclassName のスタティック・メソッドmethodName を、後続の引数args の型を指定するsignature とともに呼び出します。メソッドの結果を返します(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)
後続の引数の型を指定するsignature で、clazz から静的メソッドmethodName を呼び出します。メソッドの結果を返します(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, ...)
className クラスから、signature に続く引数の型を指定して、スタティック・メソッド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
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 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)
fieldName の値をsignature と一緒に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)
signature を持つセッターを使用して、クラスclassName の静的フィールドfieldName をvalue に設定します。
[static]
template <typename T> void QJniObject::setStaticField(jclass clazz, const char *fieldName, const char *signature, T value)
signature とのセッターを使用して、クラスclazz の静的フィールドfieldName を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 とは異なるオブジェクトへの参照を保持している場合は真を返します。
bool operator==(const QJniObject &o1, const QJniObject &o2)
o1 とo2 の両方のオブジェクトが同じ Java オブジェクトを参照している場合、または両方が NULL の場合、true を返します。それ以外の場合は false を返します。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。