gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:03 28 4
gpt4 key购买 nike

TLDR;问题:

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


更好的解释:

所以,假设我有一个 Android 应用程序,它有一个名为 “executable” 的 native 可执行文件。我将 "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() 时,从我的 native 可执行文件中,我可以使用 p.getInputStream() 在我的应用程序中获取输出 。完美。

但是,这个 native 可执行文件需要 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));

现在,每当我的 native 可执行文件使用 printf() ,我不再可以用p.getInputStream()得到输出.

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

并尝试了 fflush(stdout)在每个 printf() 之后直接在我的 native 可执行文件中调用,就像页面建议的那样,但没有用。

最佳答案

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

哦,没关系。我让它运行起来。有人能告诉我为什么这行得通而不是我最初的尝试吗?

关于java - 使用 "su -c"运行 Android NDK 可执行文件 Swallows printf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946138/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com