我想使用 Process.start() 在 NDK 上运行 tcpdump 并想将此输出捕获到缓冲区中。有人可以告诉我如何做到这一点吗?此外,该进程是否在与 JNI 调用相同的 Dalvik Vm 中创建,或者是它在不同的虚拟机中?
最佳答案
运行 native 进程并不是真正支持使用 ndk,但您不会是第一个这样做的人。
另请注意,tcpdump 可能需要以 root 或 setuid root 身份运行才能有用。而且您确实有一个为 android 适当编译和链接的 tcpdump 版本?
我认为您实际上想要的是 android.os.Exec.createSubprocess,嗯,不是公开的,而不是 Process.start。有一种使用反射的正确方法,一种错误的方法是将 Exec.java(它具有本地方法的声明)复制到您的项目中。您可以使用管道来恢复结果,或者您可以通过 shell 启动它并将输出重定向到您从 java.util 读取的文件。
有关如何执行此操作的示例,请参阅带有本地 shell 选项的 android 终端仿真器的源代码。
(实际上,我应该重申这一点——正确的做法是在您自己的 jni lib 中复制非公共(public) Exec 方法的 native 功能,这样您就不会受到平台非公共(public)部分的更改的影响) .
关于运行 native 进程的 Android NDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3757849/