简短:从 Java 调用进程的最佳方法是什么,并且通过<调用 C ++ 函数使其输出消耗< EM> JNI
很长:我正在尝试使用 Android 的日志阅读器应用程序。为此,我必须运行logcat
命令并解析其输出。我是从 Java 尝试过的,但是执行的内存分配量不仅使得进程完全变慢,而且还会使大量 GC 的日志变得混乱相关条目。
出于这个原因,我已经在 C ++ 中实现了所有与解析相关的操作。但是,我不能使用通常的fork/exec
惯用法从 C ++ 方面调用logcat
,因为 NDK 并不真正支持它。相反,我需要从 Java 启动该过程,并以某种方式使其输出可供 C ++ 代码访问。理想情况下,我会使用管道,但 Android 上的redirectOutput
ProcessBuilder
方法也不可用。
到目前为止,我提出的最佳解决方案是启动流程将其输出重定向到临时文件(使用logcat > tempfile
),并从该文件中读取 C ++ 代码。然而,这远非理想。是否有更好的方法让本机代码访问从 Java 开始的进程的输出?
答案 0 :(得分:3)
你的前提是有点误会:从Java完成时,fork / exec()在Android上不再比通过NDK完成时更“适当” - 在这两种情况下它今天都有效,但被认为是在路上Android应用应该可行。
读取日志是另一种边缘情况:从JellyBean开始,您只能读取自己的(进程或用户ID,不确定哪些)消息。有一个ADB命令可用于使给定的应用程序像以前的版本一样读取所有日志,但必须从ADB发出 - 它不能由应用程序设置。
如果你想按字面意思做你所陈述的内容,无论缺乏必要性和即将到来的实用限制,要做的事情是将连接到子进程的文件描述符的知识转换为本机代码。您可能能够传递它,或者本机代码可能能够自己发现它,因为所有文件描述符都列在/ proc中。