最近在做一个项目,希望能够将一些预编译好的bin,so等从assert目录中,拷贝到/data/local/tmp目录下面,然后在android app开发中调用
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
模拟adb shell命令的执行情况,出现的问题有如下几个:
1)没有办法创建目录
2) 没有办法使用chmod
提示,都是表示权限不够。
后面在https://stackoverflow.com/questions/23424602/android-permission-denied-for-data-local-tmp中找到了原因。因为在最新的Android版本(我们的是7.0.1),这样做是不允许的。虽然他曾经可以过。
我这边参考文中给出的方案,把我的所有预编译的东西都拷贝到了getContext().getFilesDir() 。在实际的项目中,这个地址是:/data/data/com.***.***/files.
而关于文件的拷贝,可以通过OutputStream来实现。
private void copyBigDataToSD(String strOutFileName) throws IOException {
Log.i(TAG, "start copy file " + strOutFileName);
File sdDir = mActivity.getFilesDir();//获取跟目录
File file = new File(sdDir.toString()+"/L2Norm/");
if (!file.exists()) {
file.mkdir();
}
String tmpFile = sdDir.toString()+"/L2Norm/" + strOutFileName;
File f = new File(tmpFile);
if (f.exists()) {
Log.i(TAG, "file exists " + strOutFileName);
return;
}
InputStream myInput;
java.io.OutputStream myOutput = new FileOutputStream(sdDir.toString()+"/L2Norm/"+ strOutFileName);
Log.i(TAG, "cpu property " + cpu_abi);
String input_path = cpu_abi + "/" + strOutFileName;
Log.i(TAG, "file exists " + input_path);
myInput = this.mActivity.getAssets().open(input_path);
byte[] buffer = new byte[1024];
int length = myInput.read(buffer);
while (length > 0) {
myOutput.write(buffer, 0, length);
length = myInput.read(buffer);
}
myOutput.flush();
myInput.close();
myOutput.close();
}