Android: вызов обычной программы в стиле Java с перенаправлением ввода / вывода - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть apk (или .class, как угодно) с методом public static void main (стиль java), который делает некоторые вещи.Компилирование и установка apk это дает отлично работает (из Eclipse).

Теперь из обычного приложения для Android я бы хотел вызвать этот код, перенаправляя его стандартный ввод / вывод на объекты Input- / Output-Stream.Это возможно?И если так: как?А если нет: есть ли какой-нибудь другой способ, с помощью которого я могу выполнить действие в фоновом режиме с помощью какой-либо конструкции перенаправления канала / io?

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 сентября 2010

Android полностью поддерживает каналы, а также доменные сокеты Unix. Использование exec несколько не рекомендуется, но на данный момент работает.

См. Исходный код любого эмулятора терминала Android с опцией локальной оболочки для примера того, как это сделать. По сути, ваш графический интерфейс заменяет эмулятор терминала, а ваш движок заменяет оболочку.

Если использование exec станет проблемой в будущем, вам нужно будет скомпилировать ваш движок как библиотеку jni, а не как отдельный исполняемый файл. Это не обязательно слишком сложно - просто привяжите его к примеру ndk hello-jni и получите единственную функцию jni, которая вызывает main (). Назовите это из потока Java. Общайтесь с трубами, как раньше, или установите другую схему передачи сообщений, используя jni.

Обратите внимание, что для ответов "использовать службу" также потребуется java-оболочка в службе. На данный момент вы не можете создать чисто нативный сервис, используя какой-либо поддерживаемый / одобренный механизм, если вы не являетесь поставщиком платформы, создающим и регистрирующим системный сервис.

Также имейте в виду, что ваш движок должен быть в состоянии сохранить любое состояние, и в то же время java-сторона должна была бы справиться с этим в течение жизненного цикла активности андроида (по сути, после того, как вы сделали паузу, вы можете быть убиты без дальнейшего уведомления )

0 голосов
/ 21 сентября 2010

Вы, вероятно, посмотрите на дизайн вашего приложения, основанный на услугах и намерениях.Android дизайн / архитектура / философия не поддерживает потоки / каналы между процессами.В случае шахматного приложения пользовательский интерфейс будет активным, а движок - сервисным.Для Android пользовательский интерфейс - самая важная вещь, и ваш дизайн должен учитывать это.Когда движение сделано, намерение может быть запущено из пользовательского интерфейса в фоновую службу, которая обернет код механизма (Java или, возможно, в C через NDK).Как только движение ответа будет готово, оно будет возвращено обратно в пользовательский интерфейс и отображено.Если вы не можете вписать все данные, которые вы хотите в Intent, вам может потребоваться создать Content Provider, который позволил бы UI получать недостающие элементы.Я снова думаю о хорошо сделанном приложении.Если игровая логика не занимает много времени (или вам не нужен полностью «приятный» пользовательский интерфейс, то есть перезапуск игры, если вы выходите из игры), вы можете закрепить все в одной игре и использовать AsyncTask / Threadдля игровой логики.

0 голосов
/ 21 сентября 2010

вы можете сделать это с намерениями:)

проверить android-разработчиков

...