Android Загрузить библиотеку из пути

Я проверяю разрешающий и принудительный механизм selinux (SE Linux) в Android 5.0. Я поместил файл .so в /data/data/packageName/files/libtestcalc.so.

когда устройство находится в разрешительном режиме, System.load("/data/data/packageName/files/libtestcalc.so"); - отлично работает, и я могу получить доступ к методам файла .so без каких-либо исключений.

То же, System.load("/data/data/packageName/files/libtestcalc.so"); не работает, когда устройство находится в принудительном режиме, и я получаю следующее исключение.

java.lang.UnsatisfiedLinkError: ошибка dlopen: не удалось сопоставить сегмент «/data/data/packageName/files/libtestcalc.so» 1: в доступе отказано

Я предполагаю, что в обоих режимах будет происходить один и тот же поток вызовов. Я имею в виду System.load(..)->Runtime.getRuntime().load(..)->Runtime.getRuntime(..).doload(..)->Runtime.getRuntime().nativeLoad(..)

Документация @Runtime.java->doLoad(..), упомянутая как «nativeLoad, должна быть синхронизирована, чтобы независимо от использования использовался только один LD_LIBRARY_PATH...»

Когда этот LD_LIBRARY_PATH будет обновлен?

Как Android различает загрузочные файлы по режимам? Хотите узнать другие способы загрузки файла .so из «/data/data/packageName/files/».


person user2318724    schedule 02.02.2015    source источник
comment
у вас есть какое-либо решение для этого .. ??   -  person Harry Sharma    schedule 14.03.2016


Ответы (1)


Скопируйте файл в любое место по вашему выбору в личной папке внутреннего хранилища вашего приложения, убедитесь, что он помечен как доступный только для чтения и исполняемый (недоступный для записи, особенно кем-либо еще!). Это единственное дерево местоположений, обычно доступных для записи приложением, где разрешены исполняемые файлы.

Вы можете определить местоположение личной папки, вызвав getFilesDir() в инициализированном контексте Activity или Service.

Здесь есть ряд существующих вопросов, которые демонстрируют механизмы копирования файлов в Java.

person Mujammil Ahamed    schedule 11.08.2016
comment
Также было бы неплохо упомянуть источник вашего ответа. Я наткнулся на другой ответ, точно такой же, как ваш ответ годом ранее. - person userv; 06.12.2016