UnsatisfiedLinkError libcrypto.so.1.0.0 - PullRequest
0 голосов
/ 08 мая 2019

В более новых версиях 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 пытается загрузить версионную версию?

...