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

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

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


person Carmelo M    schedule 27.07.2017    source источник
comment
Добро пожаловать в СО! Пожалуйста, найдите время, чтобы прочитать страницы справки, особенно разделы с именами На какие темы я могу задать здесь? и Какие типы вопросов мне следует избегать? . Также пройдите тур и прочитайте как задавать хорошие вопросы. Наконец, узнайте, как создать минимальный, полный и проверяемый пример. Подробная информация об ошибке очень поможет.   -  person Markus    schedule 27.07.2017
comment
Это классная идея! Но какой дочерний процесс вы хотите запустить? Сервис? Я не думаю, что это может сработать, потому что система решает, включать ли 32-битный режим на основе анализа вашего APK, и JVM настроена соответствующим образом.   -  person Alex Cohn    schedule 27.07.2017
comment
См. stackoverflow.com/a/31879900/192373: pm может вызвать ABI при установке приложение.   -  person Alex Cohn    schedule 27.07.2017
comment
@AlexCohn Спасибо! Я согласен с вами, дочерний процесс (активность) не может решить эту проблему。 [stackoverflow.com/a/31879900/192373] не работает, потому что я хочу, чтобы часть функции использовала 32-битный .so, а часть функция использует 64-битный .so,в том же приложении.   -  person Carmelo M    schedule 28.07.2017
comment
@AlexCohn У вас есть другие идеи? Мастер   -  person Carmelo M    schedule 28.07.2017
comment
Вы можете встроить исполняемый бинарник в активы, распаковать его на диск (с файлами so) и запустить с System.exec() или из натива, если хотите. Но не знаю, решит ли это проблему смешанной разрядности - никогда не пробовал.   -  person Alex Cohn    schedule 28.07.2017


Ответы (1)


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

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

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

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

person Alex Cohn    schedule 30.07.2017
comment
Это крутая идея!!! Мой проект не похож на фоновую операцию транскодирования видео, но ему нужно загрузить трехмерную графику через SurfaceView для взаимодействия с пользовательскими жестами. Как справиться с этим взаимодействием с пользовательским интерфейсом, это большая проблема, я надеюсь, что вы можете дать мне несколько идей, спасибо. - person Carmelo M; 04.08.2017
comment
Я не думаю, что вы можете обрабатывать пользовательский интерфейс или отображать живую графику через межпроцессное взаимодействие. - person Alex Cohn; 04.08.2017