libhardware.so не загружается в Android N. Это связано с новыми политиками Android N?

Мое приложение использует libhardware.so из android system/lib. Это родное приложение. до Android M. Он работает нормально, но при попытке запустить его с Android N он показывает, что dlopen не удалось найти библиотеку libhardware.so.

Недавно я наткнулся на эту статью https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk

Причина отказа в этом?


person shreya_s7    schedule 27.09.2016    source источник


Ответы (2)


Я думаю так. Вы должны использовать библиотеки, поставляемые с вашим приложением.

person macros013    schedule 27.09.2016

Да. Список библиотек, которые вы можете загрузить из системы: https://android.googlesource.com/platform/ndk/+/cc508145a36939c74399a90b9092673cf54e67f4/build/core/build-binary.mk#61

system_libs := \
    android \
    c \
    dl \
    jnigraphics \
    log \
    m \
    m_hard \
    stdc++ \
    z \
    EGL \
    GLESv1_CM \
    GLESv2 \
    GLESv3 \
    vulkan \
    OpenSLES \
    OpenMAXAL \
    mediandk \
    atomic
person Dan Albert    schedule 27.09.2016
comment
если быть точным, список доступен в документах с минимальным доступным API: developer.android.com /ndk/guides/stable_apis.html - person V-master; 28.09.2016
comment
Хотя этот документ устарел. Он увеличивается только до 21, но в 23 и 24 были добавлены новые API. - person Dan Albert; 28.09.2016
comment
Привет, Дэн! Сейчас мое приложение использует libhardware.so. Можно ли как-нибудь попросить мое приложение переключиться на собственную копию libhardware.so? Я попытался связать libhardware.so в /data/data/‹app›/lib/libhardware.so, но все равно не получается. - person shreya_s7; 29.09.2016
comment
добавление дополнительной информации о том, что в моем проекте нет файла android.mk. Я использую команду проекта обновления Android. - person shreya_s7; 29.09.2016
comment
libhardware также зависит от нескольких библиотек, которых нет в NDK (это относится ко всем системным библиотекам). Если вы сняли libhardware.so с устройства Android или из сборки aosp, у вас все еще будет эта проблема. logcat должен печатать нужную вам информацию. - person Dan Albert; 29.09.2016
comment
Добавлены все библиотеки, необходимые для libhardware, решили мою проблему. - person shreya_s7; 04.10.2016
comment
@shreya_s7 ты только что поместил все LIB из /system/lib/hw в свою папку /data/data/project/lib? Вы поместили hw в подпапку или просто скопировали все библиотеки из hw прямо в .../project/lib? - person Maxim Metelskiy; 05.11.2016
comment
@MaximMetelskiy Я только что скопировал libhardware.so в /data/data/project/lib/. - person shreya_s7; 07.11.2016
comment
@ shreya_s7 Я понимаю, но что вы сделали с библиотеками, от которых зависит libhardware.so? - person Maxim Metelskiy; 07.11.2016
comment
@MaximMetelskiy Мне нужно получить аппаратный модуль для тестирования. После изменений часть моего кода по-прежнему дает сбой, так как libhardware косвенно вызывает gralloc.‹aarch›. Поэтому в настоящее время я пытаюсь решить эту проблему. Пожалуйста, дайте мне знать, если у вас есть какие-либо подробности по этому поводу. - person shreya_s7; 15.11.2016
comment
@shreya_s7 Лучшим решением будет избегать использования приватных библиотек) Но вы можете попробовать пересобрать libhardware.so из AOSP. Он ищет аппаратные библиотеки, используя абсолютные пути, и вы можете изменить источники, чтобы добавить каталог вашего приложения в список поиска. А также добавьте в свой проект все необходимые аппаратные библиотеки. Но это очень нестабильное решение, потому что разные устройства могут иметь разные аппаратные библиотеки. Вы также можете попробовать установить свое приложение как системное приложение, используя root-доступ, тогда оно сможет загружать частные системные библиотеки. Но это также очень нестабильное решение. - person Maxim Metelskiy; 15.11.2016