下面是如何打包和運行可執行文件的完整指南。我基於我在這裏找到的和其他鏈接,以及我自己的試驗和錯誤。
1)在你的SDK項目,把可執行文件在/資產的文件夾
2)編程得到的字符串的文件目錄(/數據/數據/ your_app_name /文件)這樣
String appFileDirectory = getFilesDir().getPath();
String executableFilePath = appFileDirectory + "/executable_file";
3。)在您的應用程序的項目的Java代碼:從/資產文件夾到你的應用程序的「文件」子文件夾中複製的可執行文件(通常是/數據/數據/ your_app_name /文件)用這樣的功能:
private void copyAssets(String filename) {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
Log.d(TAG, "Attempting to copy this file: " + filename); // + " to: " + assetCopyDestination);
try {
in = assetManager.open(filename);
Log.d(TAG, "outDir: " + appFileDirectory);
File outFile = new File(appFileDirectory, filename);
out = new FileOutputStream(outFile);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(IOException e) {
Log.e(TAG, "Failed to copy asset file: " + filename, e);
}
Log.d(TAG, "Copy success: " + filename);
}
4)更改executable_file上的文件許可權以使其可執行。不要將其與Java調用:
File execFile = new File(executableFilePath);
execFile.setExecutable(true);
5)執行這樣的文件:
Process process = Runtime.getRuntime().exec(executableFilePath);
注意的是,這裏所指的任何文件(如輸入和輸出文件)都必須有自己的完整路徑絃樂建。這是因爲這是一個單獨產生的過程,它沒有關於「pwd」的概念。
如果你想讀命令的stdout,你可以這樣做,但到目前爲止它只是爲我工作的系統命令(如「ls」),而不是可執行文件:
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
Log.d (TAG,「output:」+ output.toString());
@Aleadam:感謝您的回覆。是的,源代碼被編譯爲ARM可執行文件,並且我嘗試在命令行上通過rooted Android手機執行它,並且它工作正常。我需要的是一種打包此可執行文件的方法在我的Android項目中,將它複製到內部文件系統(/ data/data/),然後從那裏執行它 –
Samuh
2011-04-13 01:01:16
很酷,那麼我認爲你的狀態良好。或者它只是做一個特定的,快速的工作? – Aleadam 2011-04-13 03:45:54
@Samuh檢查更新的答案 – Aleadam 2011-04-13 04:46:28