В более новых версиях Android приложение не запускается с исключением UnsatisfiedLinkError.
Похоже, org.qtproject.qt5.android.QtNative.loadBundledLibraries
пытается загрузить версионную библиотеку, но не может!
Так как мой app.shell.ShellActivity.onCreate()
не загружает библиотеку напрямую (как показано ниже, там нет system.load
), я не имею ни малейшего представления, как справиться с этой ошибкой загрузки библиотеки.
public class ShellActivity extends QtActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (running) {
Log.e(TAG, "An instance of this activity is already running!");
setResult(-2);
finish();
System.exit(-2);
return;
}
running = true;
}
}
Библиотека настроена в .pro, как показано ниже,
app_android: contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
LIBS += -L$$PWD/lib/android/ -lcrypto -lssl
ANDROID_EXTRA_LIBS =
$$PWD/lib/android/libcrypto.so
$$PWD/lib/android/libssl.so
}
CONFIG += app_android
Обратите внимание, что приложение работает нормально в других более низких версиях Android (протестировано на 4.4 и 5.1), но не работает на Android 9.0 (Pie).
objdump output
libcrypto.so
file format elf32-little
NEEDED libdl.so
NEEDED libc.so
SONAME libcrypto.so
libapp.so
file format elf32-little
NEEDED libz.so
NEEDED libcrypto.so
NEEDED libssl.so
NEEDED libQt5Quick.so
NEEDED libQt5Multimedia.so
NEEDED libQt5Svg.so
NEEDED libQt5Widgets.so
NEEDED libQt5Gui.so
NEEDED libQt5Qml.so
NEEDED libQt5Network.so
NEEDED libQt5Sql.so
NEEDED libQt5SerialPort.so
NEEDED libQt5AndroidExtras.so
NEEDED libQt5Core.so
NEEDED libGLESv2.so
NEEDED libgnustl_shared.so
NEEDED liblog.so
NEEDED libdl.so
NEEDED libstdc++.so
NEEDED libm.so
NEEDED libc.so
SONAME libshell.so
Трассировка стека, как показано ниже. Есть идеи как это решить?
05-08 14:29:26.513 26065-26065/app.shell W/System: ClassLoader referenced unknown path:
05-08 14:29:26.704 26065-26065/app.shell W/System.err: java.lang.reflect.InvocationTargetException
05-08 14:29:26.705 26065-26065/app.shell W/System.err: at java.lang.reflect.Method.invoke(Native Method)
at org.qtproject.qt5.android.bindings.QtLoader.loadApplication(QtLoader.java:241)
at org.qtproject.qt5.android.bindings.QtLoader.startApp(QtLoader.java:676)
at org.qtproject.qt5.android.bindings.QtActivityLoader.onCreate(QtActivityLoader.java:183)
at org.qtproject.qt5.android.bindings.QtActivity.onCreateHook(QtActivity.java:266)
at org.qtproject.qt5.android.bindings.QtActivity.onCreate(QtActivity.java:273)
at app.shell.ShellActivity.onCreate(ShellActivity.java:41)
at android.app.Activity.performCreate(Activity.java:7326)
at android.app.Activity.performCreate(Activity.java:7317)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
05-08 14:29:26.706 26065-26065/app.shell W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3066)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3229)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "libcrypto.so.1.0.0" not found
at java.lang.Runtime.load0(Runtime.java:928)
at java.lang.System.load(System.java:1633)
at org.qtproject.qt5.android.QtNative.loadBundledLibraries(QtNative.java:209)
at org.qtproject.qt5.android.QtActivityDelegate.loadApplication(QtActivityDelegate.java:599)
... 22 more
Было предложено несколько решений на SO , но это исправление файла .so новым SONAME. В этом случае мой SONAME внутри эльфа не является версионным. Если я отредактирую и добавлю к нему версию, я думаю, что это либо сломает приложение, которое уже работает на старых версиях Android, либо полностью испортит .so loading / reloc.
Есть идеи, почему, несмотря на то, что не версионная версия, новый Android пытается загрузить версионную версию?