0

In newer Android versions, the application is failing to start with UnsatisfiedLinkError exception. It looks like the org.qtproject.qt5.android.QtNative.loadBundledLibraries is trying to load the versioned library but is not able to!

Since my app.shell.ShellActivity.onCreate() is not loading the lib directly (shown below there is no system.load in there), I don't have any idea how to tackle this lib loading failure.

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;
}
}

The lib is configured in .pro as shown below,

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

Please note that the application is running fine in other lower android versions, (tested on 4.4, and 5.1) but failing on 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

The stacktrace is as shown below. Any idea how to solve it?

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

There were some solutions proposed at SO, but that is to patch the .so file with new SONAME. In this case my SONAME inside the elf is unversioned. If i hex edit and add version to it, i guess either it would break the app which is already working on older android versions, or altogether corrupt the .so loading/reloc.

Any idea why eventhough the so is unversioned newer android is trying to load versioned one?

Jimson James
  • 2,937
  • 6
  • 43
  • 78

0 Answers0