Невозможно загрузить собственную библиотеку в 4.2 4.3, но загружает последние версии

67
9

У меня есть собственное приложение для Android (NativeActivity, нет java-кода, но только родная библиотека libMyApp.so)

Приложение отлично работает на Android 5.0.1 и 5.1.1, но сбой на Android 4.3 и 4.2.2

Для версий 5.0.1 и 5.1.1 загрузите .so lib с

    /data/data/com.example.myapp/lib/libMyApp.so

4.3 и 4.2.2 пытаются загрузить из одного из следующих мест

    /data/app-lib/com.example.myapp-1/libMyApp.so /data/app-lib/com.example.myapp-2/libMyApp.so

Сообщение об ошибке

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.example.myapp-2/libMyApp.so
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.access$700(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method

Мое приложение имеет одну общую библиотеку, то есть не зависит от сторонних библиотек.

И имя модуля указано в файле манифеста следующим образом:

<meta-data android:name="android.app.lib_name"
android:value="MyApp" />

libMyApp.so связан с -llog -lGLESv3 -lGLESv2 -lGLESv1_CM -lEGL -landroid -lz libs.

Почему lib не может быть загружен, что мне не хватает?

Почему старые версии для Android не загружаются из /data/data/com.example.myapp/lib/?!

Имеются ли в старых версиях Android другое соглашение об именовании модулей?

спросил(а) 2015-09-09T16:00:00+03:00 4 года, 9 месяцев назад
1
Решение
77

После 2 дней исследований мне наконец удалось найти источник проблемы.

Во-первых, как-то Native App не показывает полную ошибку компоновщика в logcat - (я не знаю, почему!)

Но после преобразования того же приложения в приложение Java/JNI я смог увидеть следующую ошибку компоновщика только в версиях Android до L (5. *).

dlopen ("/data/app-lib/com.example.myapp/libMyApp.so") не удалось: dlopen не удалось: не удалось найти символ "srand", на который ссылается "libMyApp.so"...

Я использовал, чтобы скомпилировать код cpp с уровнем api-21 api от r10e ndk.

Что в принципе не гарантирует, что приложение будет работать нормально в версии для Android до L.

Вот официальный отчет об ошибке в Android.

Как и в моем родном приложении, функции OGLES3.1 используются, я не могу понизить целевой уровень SDK с 21, поэтому у меня не было выбора, кроме обновления min sdk level до 21.

ответил(а) 2015-09-10T16:57:00+03:00 4 года, 9 месяцев назад
39

загрузите ли вы свою библиотеку в своем классе?


static {
System.loadLibrary("nativeLib");
}

ответил(а) 2015-09-09T16:06:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема