Как смешивать 32 и 64-разрядные файлы .so в приложении

Carmelo M 09/15/2017. 1 answers, 84 views
java android android linux android-ndk android-ndk ndk-build

Во-первых, я знаю, что в приложении не допускается смешанное использование разных архитектур .so-файла (для части используется только 32, другая часть использует только 64)

Итак, я попытался открыть новый процесс для динамической загрузки 64-х и 32-разрядных файлов, но System.load() выкинул ошибку и приложение разбилось! Как решить эту проблему с помощью нескольких процессов? Или есть ли другой способ решить это?

5 Comments
Markus 07/27/2017
Добро пожаловать в SO! Пожалуйста, найдите время, чтобы прочитать страницы справки , особенно разделы «Какие темы можно задать здесь?» и «Какие типы вопросов я должен избегать?» , Также, пожалуйста, посетите тур и прочитайте, как задать хорошие вопросы . Наконец, узнайте, как создать минимальный, полный и проверенный пример . Подробные сведения об ошибке очень помогли бы.
Alex Cohn 07/27/2017
Это классная идея! Но какой детский процесс вы хотите начать? Сервис? Я не думаю, что это может сработать, потому что система решает, включать ли 32-разрядный режим на основе анализа вашего APK, и JVM настроен соответствующим образом.
Alex Cohn 07/27/2017
См. Stackoverflow.com/a/31879900/192373 : pm может заставить ABI при установке приложения.
Carmelo M 07/28/2017
@AlexCohn Спасибо! Я согласен с вами, дочерний процесс (Activity) не может решить эту проблему. [Stackoverflow.com/a/31879900/192373] не работает, потому что я хочу, чтобы часть функции использовала 32-разрядную .so и часть функция использует 64-разрядную .so, в том же приложении.
Carmelo M 07/28/2017
@AlexCohn У вас есть другие идеи? Мастер

1 Answers


Alex Cohn 07/30/2017.

Ну, я попробовал. На armeabi взгляд, это работает: используйте armeabi «обычным способом» и запустите исполняемый файл arm64-v8a с Java с помощью Runtime.exec () или с C с помощью system () .

Вы можете поместить исполняемый файл в активы и распаковать его вручную, или вы можете обмануть и переименовать его так, чтобы он начинался с lib и заканчивался на .so ; теперь вы можете поместить этот файл в jniLibs/armeabi .

Противоположный способ тоже работает: запустить 32-битный исполняемый файл (не забудьте -fPIE ) из 64-битного приложения.

Убедитесь, что пути поиска библиотеки не сталкиваются.

2 comments
Carmelo M 08/04/2017
Это классная идея !!! Мой проект не похож на фоновый режим транскодирования видео, но нужно загрузить трехмерную графику через SurfaceView для взаимодействия с жесты пользователя. Как бороться с этим взаимодействием с пользовательским интерфейсом - большая проблема, я надеюсь, что вы можете дать мне несколько идей, спасибо
Alex Cohn 08/04/2017
Я не думаю, что вы можете обрабатывать пользовательский интерфейс или выполнять живую графику через межпроцессное общение

Related questions

Hot questions

Language

Popular Tags