it was written in Qt and was used to draw text / arrows / areas and everything else.
QApplication a(argc, argv);
This was not the case for the Qt platform plugin "android".
<!-- Deploy Qt libs as part of package --> <meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/> <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/> <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/> <!-- Run with local libs --> <meta-data android:name="android.app.use_local_qt_libs" android:value="1"/> <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/> <meta-data android:name="android.app.load_local_libs" android:value="plugins/platforms/android/libqtforandroid.so"/> <meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidAccessibility.jar:jar/QtAndroid-bundled.jar:jar/QtAndroidAccessibility-bundled.jar"/> <meta-data android:name="android.app.static_init_classes" android:value=""/>
System.loadLibrary ("plugins_platforms_android_libqtforandroid");, but it still fell! True, the exception here was another and more interesting:
I / Qt: qt start
05-17 11: 12: 33.975 11084-11084 / project name A / libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code = 1), thread 11084 (ndroid.gribview)
05-17 11: 12: 33.978 11084-11084 / project name A / libc: Send stop signal to pid: 11084 in void debuggerd_signal_handler (int, siginfo_t, void)
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/) { QT_USE_NAMESPACE typedef union { JNIEnv *nativeEnvironment; void *venv; } UnionJNIEnvToVoid; __android_log_print(ANDROID_LOG_INFO, "Qt", "qt start"); UnionJNIEnvToVoid uenv; uenv.venv = Q_NULLPTR; m_javaVM = Q_NULLPTR; if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { __android_log_print(ANDROID_LOG_FATAL, "Qt", "GetEnv failed"); return -1; } JNIEnv *env = uenv.nativeEnvironment; if (!registerNatives(env) || !QtAndroidInput::registerNatives(env) || !QtAndroidMenu::registerNatives(env) || !QtAndroidAccessibility::registerNatives(env) || !QtAndroidDialogHelpers::registerNatives(env)) { __android_log_print(ANDROID_LOG_FATAL, "Qt", "registerNatives failed"); return -1; } m_javaVM = vm; return JNI_VERSION_1_4; }
registerNatives(env)
jmethodID methodID; GET_AND_CHECK_STATIC_METHOD(methodID, m_applicationClass, "activity", "()Landroid/app/Activity;"); __android_log_print(ANDROID_LOG_INFO, "Check Class 8", "activity "); jobject activityObject = env->CallStaticObjectMethod(m_applicationClass, methodID); __android_log_print(ANDROID_LOG_INFO, "Check Class 9 ", " methodID "); GET_AND_CHECK_STATIC_METHOD(methodID, m_applicationClass, "classLoader", "()Ljava/lang/ClassLoader;"); __android_log_print(ANDROID_LOG_INFO, "Check Class 10", " classLoader "); if(activityObject!=nullptr) { __android_log_print(ANDROID_LOG_INFO, "No tull activityObject", " Not Null "); } if(methodID!=nullptr) { __android_log_print(ANDROID_LOG_INFO, "No tull methodID", " Not Null "); } m_classLoaderObject = env->NewGlobalRef(env->CallStaticObjectMethod(m_applicationClass, methodID)); if(m_classLoaderObject!=nullptr) { __android_log_print(ANDROID_LOG_INFO, "No tull m_classLoaderObject", " Not Null "); } clazz = env->GetObjectClass(m_classLoaderObject);
QtNative.setActivity(this, null); QtNative.setClassLoader(getClassLoader());
QtNative.loadBundledLibraries(); QtNative.loadQtLibraries();
registerNatives(env)
if (!registerNatives(env) /* || !QtAndroidInput::registerNatives(env) || !QtAndroidMenu::registerNatives(env) || !QtAndroidAccessibility::registerNatives(env) || !QtAndroidDialogHelpers::registerNatives(env)*/) { __android_log_print(ANDROID_LOG_FATAL, "Qt", "registerNatives failed"); return -1; }
This was not the case for the Qt platform plugin "android".
QtNative.loadBundledLibraries(); QtNative.loadQtLibraries();
static void init_platform(const QString &pluginArgument, const QString &platformPluginPath, const QString &platformThemeName, int &argc, char **argv) { // Split into platform name and arguments QStringList arguments = pluginArgument.split(QLatin1Char(':')); const QString name = arguments.takeFirst().toLower(); QString argumentsKey = name; argumentsKey[0] = argumentsKey.at(0).toUpper(); arguments.append(QLibraryInfo::platformPluginArguments(argumentsKey)); // Create the platform integration. QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath); if (QGuiApplicationPrivate::platform_integration) { QGuiApplicationPrivate::platform_name = new QString(name); } else { QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath); QString fatalMessage = QStringLiteral("This application failed to start because it could not find or load the Qt platform plugin \"%1\".\n\n").arg(name); ....
void QGuiApplicationPrivate::createPlatformIntegration() { // Use the Qt menus by default. Platform plugins that // want to enable a native menu implementation can clear // this flag. QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true); // Load the platform integration QString platformPluginPath = QLatin1String(qgetenv("QT_QPA_PLATFORM_PLUGIN_PATH")); QByteArray platformName; #ifdef QT_QPA_DEFAULT_PLATFORM_NAME platformName = QT_QPA_DEFAULT_PLATFORM_NAME; #endif QByteArray platformNameEnv = qgetenv("QT_QPA_PLATFORM"); if (!platformNameEnv.isEmpty()) { platformName = platformNameEnv; } QString platformThemeName = QString::fromLocal8Bit(qgetenv("QT_QPA_PLATFORMTHEME")); // Get command line params QString icon; int j = argc ? 1 : 0; for (int i=1; i<argc; i++) { if (argv[i] && *argv[i] != '-') { argv[j++] = argv[i]; continue; } const bool isXcb = platformName == "xcb"; QByteArray arg = argv[i]; if (arg.startsWith("--")) arg.remove(0, 1); if (arg == "-platformpluginpath") { if (++i < argc) platformPluginPath = QLatin1String(argv[i]); } else if (arg == "-platform") { if (++i < argc) platformName = argv[i]; } else if (arg == "-platformtheme") { if (++i < argc) platformThemeName = QString::fromLocal8Bit(argv[i]); } else if (arg == "-qwindowgeometry" || (isXcb && arg == "-geometry")) { if (++i < argc) windowGeometrySpecification = QWindowGeometrySpecification::fromArgument(argv[i]); } else if (arg == "-qwindowtitle" || (isXcb && arg == "-title")) { if (++i < argc) firstWindowTitle = QString::fromLocal8Bit(argv[i]); } else if (arg == "-qwindowicon" || (isXcb && arg == "-icon")) { if (++i < argc) { icon = QString::fromLocal8Bit(argv[i]); } } else { argv[j++] = argv[i]; } } if (j < argc) { argv[j] = 0; argc = j; } init_platform(QLatin1String(platformName), platformPluginPath, platformThemeName, argc, argv); if (!icon.isEmpty()) forcedWindowIcon = QDir::isAbsolutePath(icon) ? QIcon(icon) : QIcon::fromTheme(icon); }
char *SDKEnvironment::argv[] = {"-platform libplugins_platforms_android_libqtforandroid.so:plugins/platforms/android/libqtforandroid.so -platformpluginpath /data/app-lib/__jniLibs"};
apply plugin: 'com.android.applicatioin'
to apply plugin: 'com.android.library'
. So we create aar file, not apkSource: https://habr.com/ru/post/301852/
All Articles