以下是有关如何打包和运行可执行文件的完整指南。我基于我在这里和其他链接找到的内容,以及我自己的试验和错误。
1.) 在 SDK 项目中,将可执行文件放在 /assets 文件夹中
2.)以编程方式获取该文件目录的字符串(/data/data/your_app_name/files),如下所示
String appFileDirectory = getFilesDir().getPath();
String executableFilePath = appFileDirectory + "/executable_file";
3.) 在应用的项目 Java 代码中:将可执行文件从 /assets 文件夹复制到应用的“files”子文件夹(通常是 /data/data/your_app_name/files)中,函数如下所示:
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);
请注意,此处引用的任何文件(如输入和输出文件)都必须构造其完整路径 String。这是因为这是一个单独的生成过程,它对“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());