Вызов кода Java из внешнего собственного исполняемого файла в Android

Итак, вот что я хочу сделать. У меня есть сторонний собственный исполняемый файл, который порождается моей активностью. Активность и собственный исполняемый файл взаимодействуют через TCP. Дело в том, что стороннее приложение использует libusb и поэтому требует root. Поэтому я подумал, что возможно написать оболочку libusb-java с тем же интерфейсом, что и исходная libusb, но вместо этого использующую Android USB Host API. Поэтому я мог бы просто связать исполняемый файл с моим libusb-java, не меняя его, и он использовал бы Android USB Host API. Проблема в том, что если я хочу написать libusb-java, мне нужно иметь доступ к JVM изнутри библиотеки (которая будет динамически загружаться при запуске стороннего исполняемого файла), но поскольку это не будет связан на стороне Java, у меня нет доступа к нему. Есть ли простой способ вызвать некоторый код Java из собственного исполняемого файла, который не связан с действием (возможно, отражением?). Любые идеи?

Например: если мой собственный двоичный файл вызывает *libusb_open()*, он на самом деле вызывает *libusb_open()* из libusb-java, который, в свою очередь, должен вызывать openDevice() из android.hardware.usb.UsbManager, а не исходная прямая нативная реализация. (я упрощаю, но это основная идея)


person Martin Marinov    schedule 02.01.2013    source источник


Ответы (1)


Простой ответ: нет, не существует. Вы можете запустить свою собственную виртуальную машину Dalvik и, возможно, вызвать ее, но она не будет иметь статуса Activity в системе Android, поэтому будет сложно использовать многие службы платформы.

Вам лучше попытаться реструктурировать собственный код, чтобы он работал как библиотека, загружаемая DVM, в обычном режиме Android в качестве процесса размещения Activity или Service. Иногда это может быть почти так же просто, как вызвать main() из статической подпрограммы jni, но остерегайтесь потенциального несоответствия в статических данных на уровне процесса, поскольку Android часто запускает новый объект в старом процессе.

Или вы можете проксировать свои смоделированные вызовы API через TCP, [с некоторыми хитростями] Binder или какой-либо другой механизм IPC.

person Chris Stratton    schedule 02.01.2013
comment
Я боялся этого. Связывание не поможет, так как будут проблемы с лицензией :) Но в любом случае, я подумаю об этом. Спасибо. - person Martin Marinov; 03.01.2013