使用" su -c"运行Android NDK可执行文件燕子printf()

时间:2014-04-08 19:10:07

标签: java android c++ android-ndk root

TLDR;问题:

当我使用Runtime.exec()单独运行原生Android可执行文件时,我可以从我的应用中获取其printf()输出。但是当我使用Runtime.exec("su -c <native executable>")时,我无法再获得它的输出。


更好的解释:

所以,我说有一个Android应用程序,它有一个名为“executable”的本机可执行文件。我将“可执行文件”重命名为“libexecutable.so”,以欺骗apk安装程序将文件复制到设备中。

然后,应用程序使用

运行可执行文件
String executable = context.getFilesDir().getParent() + "/lib/libexecutable.so";
String me = context.getPackageName();

Process p = Runtime.getRuntime().exec(String.format("%s %s", executable, me));

从我的原生可执行文件中,每当我使用 printf() 时,我都可以使用 p.getInputStream() 在我的应用中获得输出。完美。

但是,这个本机可执行文件需要root权限,所以,我这样运行:

String su = "su -c";
String executable = context.getFilesDir().getParent() + "/lib/libexecutable.so";
String me = context.getPackageName();

Process p = Runtime.getRuntime().exec(String.format("%s %s %s", su, executable, me));

现在,只要我的原生可执行文件使用printf(),我不再就可以获得p.getInputStream()的输出。

我查了一下并得到了这个: Java: can't get stdout data from Process unless its manually flushed

在每次fflush(stdout)调用后直接在我的原生可执行文件中尝试了printf(),就像建议的页面一样,但它没有用。

1 个答案:

答案 0 :(得分:2)

String[] cmd = new String[]{
    "su",
    "-c",
    getFilesDir().getParent() + "/lib/libexecutable.so " + getPackageName()
};
Process p = Runtime.getRuntime().exec(cmd);
//No more permission denied error

哦,没关系。我用它来运行它。有人可以告诉我为什么这是有效的,而不是我最初的尝试?