Java – How do I run an executable in Assets?

How do I run an executable in Assets?… here is a solution to the problem.

How do I run an executable in Assets?

How do I add an executable to Assets and run it in Android and display the output?

I

have an executable that I can run. I’m assuming some chmod is needed in the code.

Thank you.

Solution

Here is my answer

Put copyAssets() in your main activity.

Someone’s code:

private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.e("tag", "Failed to get asset file list.", e);
    }
    for(String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(filename);
            File outFile = new File(getFilesDir(), filename);
            out = new FileOutputStream(outFile);
            copyFile(in, out);

} catch(IOException e) {
            Log.e("tag", "Failed to copy asset file: " + filename, e);
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                     NOOP
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                     NOOP
                }
            }
        }
    }
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Here is also the code to run the command

public String runcmd(String cmd){
    try {
        Process p = Runtime.getRuntime().exec(cmd);

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
int read;
char[] buffer = new char[4096];
        StringBuffer out = new StringBuffer();
        while ((read = in.read(buffer)) > 0) {
            out.append(buffer, 0, read);
        }
        in.close();
        p.waitFor();

return out.substring(0);

} catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}

You may need to change it to

String prog=  "programname";
String[] env= { "parameter 1","p2"};
File dir=  new File(getFilesDir().getAbsolutePath());
Process p = Runtime.getRuntime().exec(prog,env,dir);

Ensure proper parameter handling

Add this to your main code as well
Check the correct copy of the file

String s;
File file4 = new File(getFilesDir().getAbsolutePath()+"/executable");
file4.setExecutable(true);
s+=file4.getName();
s+=file4.exists();
s+=file4.canExecute();
s+=file4.length();
output s however you want it

Should be written: file name, true, true, correct file length.

Related Problems and Solutions