// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause //! [Working with lists] QStringList getTrackTitles(const QJniObject &album) { QStringList stringList; QJniObject list = album.callObjectMethod("getTitles", "()Ljava/util/List;"); if (list.isValid()) { const int size = list.callMethod("size"); for (int i = 0; i < size; ++i) { QJniObject title = list.callObjectMethod("get", "(I)Ljava/lang/Object;", i); stringList.append(title.toString()); } } return stringList; } //! [Working with lists] //! [QJniObject scope] void functionScope() { QString helloString("Hello"); jstring myJString = 0; { QJniObject string = QJniObject::fromString(helloString); myJString = string.object(); } // Ops! myJString is no longer valid. } //! [QJniObject scope] //! [C++ native methods] 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(fromJavaOne)}, {"callNativeTwo", "(I)V", reinterpret_cast(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("my/java/project/FooJavaClass", "foo", "(I)V", 10); // Output: 10 < 100 QJniObject::callStaticMethod("my/java/project/FooJavaClass", "foo", "(I)V", 100); // Output: 100 >= 100 } //! [C++ native methods] //! [Java native methods] 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); } //! [Java native methods]