У меня есть приложение NDK, которое может быть расширено через плагины, которые загружаются через dlopen
. Это используется для работы в порядке, но он больше не работает с Android N. Как указано в developer documentation, dlopen
теперь официально отказались:Как заменить dlopen() в Android Nougat?
Начиная с Android 7.0, система предотвращает приложения от динамической компоновки с библиотеками, не НДК, что может привести к сбою вашего приложения. Это изменение в поведении направлено на создание согласованного опыта приложений в обновлениях платформы и разных устройствах.
...
Все приложения генерируют ошибку времени выполнения при вызове API, который не является общедоступным и временно недоступным. В результате System.loadLibrary и dlopen (3) возвращают NULL и могут привести к сбою вашего приложения.
Я видел, что есть hack, что просто вручную реализует dlopen
и dlsym
для Android. Это, похоже, работает для Android N, но, конечно, никто не может сказать, как долго это все еще будет работать.
Вот почему я подумываю о том, чтобы изменить мой дизайн плагина на что-то официально поддерживаемое и надежное будущее. Наиболее очевидным выбором будет использование API сервисов Android и просто распространение моих плагинов как отдельных APK, которые реализуют Сервис.
Однако мне не очень нравится эта идея, так как я использую NDK, и я не думаю, что Service API доступен для NDK. Конечно, я мог бы создать Сервис на Java, а затем использовать JNI для его интеграции с моим C-кодом, но это, конечно, не очень изящное решение.
Именно поэтому я хотел бы спросить, что является рекомендуемым способом поддержки плагинов, которые ранее были dlopen
- основаны на Android N? Есть ли альтернативный маршрут, или я вынужден использовать Service API сейчас?
«Я видел, что есть хак» - вы уверены? Я думаю, что они поддерживают только 'dlopen' уже загруженную библиотеку, поэтому это не будет работать в вашем случае использования. Повторное выполнение 'dlopen' с нуля, с блэкджеком и символом W^W символом и т. Д., Было бы серьезным делом. – yugr
О, верно, глядя на код, это действительно похоже на трюк для уже загруженных библиотек. Очень жаль :( – Andreas