1) Нет, не должно быть никаких ограничений, кроме тех, которые обращаются к системным файлам и, следовательно, требуют root.Лучшее место было бы прямо к / data / data / [your_package_name], чтобы избежать загрязнения в другом месте.
2) Очень подробное обсуждение компиляции для нативных библиотек можно найти здесь: http://www.aton.com/android-native-libraries-for-java-applications/.Другой вариант - кросс-компилятор для arm (вот тот, который используется для компиляции ядра, он бесплатный: http://www.codesourcery.com/sgpp/lite/arm).Если вы планируете поддерживать службу, которая выполняет вашу команду, имейте в виду, что службы могут быть остановлены и перезапущены Android в любой момент.
3) Теперь, если у вас нет исходного кода, я надеюсь, что ваш файл по крайней мере скомпилирован как исполняемый файл arm.Если нет, я не вижу, как ты мог бы даже запустить его.
Вы запустите файл, выполнив следующие команды в своем классе Java:
String myExec = "/data/data/APPNAME/FILENAME";
Process process = Runtime.getRuntime().exec(myExec);
DataOutputStream os = new DataOutputStream(process.getOutputStream());
DataInputStream osRes = new DataInputStream(process.getInputStream());
Я ничего не знаю о вашем исполняемом файле, поэтому вам может понадобиться или не понадобиться на самом деле получитьinputStream и outputStream.
Я предполагаю, что о запуске adb для передачи двоичного файла не может быть и речи, поэтому я искал изящный способ упаковать его.Я нашел отличный пост о включении исполняемого файла в ваше приложение.Проверьте это здесь: http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App
Важной частью является эта (выделение моя):
Из приложения Java для Android, используя assets
папку
- Включите двоичный файл в папку активов.
- Используйте
getAssets().open(FILENAME)
, чтобы получить InputStream
. - Запишите его в
/data/data/APPNAME
(например, /data/data/net.gimite.nativeexe
), где находится ваше приложение.имеет доступ для записи файлов и делает их исполняемыми. - Запустите
/system/bin/chmod 744 /data/data/APPNAME/FILENAME
, используя код выше. - Запустите свой исполняемый файл, используя код выше.
В этом посте используется папка assets
, инсталяция из папки raw
, которую android предлагает для статических файлов:
Совет. Если вы хотите сохранить статический файл в приложении во время компиляции,сохраните файл в вашем проекте res / raw / каталог.Вы можете открыть его с помощью openRawResource (), передавая R.raw.идентификатор ресурса.Этот метод возвращает InputStream, который вы можете использовать для чтения файла (но вы не можете записать в исходный файл).
Чтобы получить доступ к папке данных, вы можете следовать инструкциям здесь: http://developer.android.com/guide/topics/data/data-storage.html#filesInternal Кроме того, есть метод File#setExecutable(boolean);
, который должен работать вместо команды оболочки.
Итак, собрав все воедино, я бы попробовал:
InputStream ins = context.getResources().openRawResource (R.raw.FILENAME)
byte[] buffer = new byte[ins.available()];
ins.read(buffer);
ins.close();
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(buffer);
fos.close();
File file = getFileStreamPath (FILENAME);
file.setExecutable(true);
Конечно, все это нужно делать только один раз после установки.Вы можете выполнить быструю проверку внутри onCreate()
или любого другого объекта, который проверяет наличие файла и выполняет все эти команды, если файла там нет.
Дайте мне знать, если он работает.Удачи!