下面是如何打包和运行可执行文件的完整指南。我基于我在这里找到的和其他链接,以及我自己的试验和错误。
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