2

简短:从Java调用进程并将其输出由通过JNI调用的C++函数使用的最佳方法是什么。

Long:我正在试验Android的日志阅读器应用程序。为此,我必须运行logcat命令并解析其输出。我已经从Java尝试过这个,但是执行的内存分配量不仅使过程非常缓慢,而且还会使相同的日志变得混乱,其中包含许多与GC相关的条目。

出于这个原因,我在C++中实现了所有与解析相关的操作。但是,我不能使用通常的习惯用法从C++fork/exec端调用,因为NDK并不真正支持它。相反,我需要从Java启动该过程,并以某种方式使其输出可供C++代码访问。理想情况下,我会为此使用管道,但Android上也没有这些方法。logcatredirectOutputProcessBuilder

到目前为止,我想出的最佳解决方案是启动进程,将其输出重定向到一个临时文件(使用logcat > tempfile),并从该文件中读取C++代码。然而,这远非理想。有没有更好的方法让本机代码访问从Java开始的进程的输出?

4

1 回答 1

3

您的前提有点错误:从 Java 完成的 fork/exec() 在 Android 上不再“合适”,而不是通过 NDK 完成 - 在这两种情况下它今天都有效,但被认为超出了 Android 应用程序的方式应该工作。

阅读日志是另一个边界情况:对于 JellyBean,您只能阅读自己的(进程或用户 ID,不确定是哪个)消息。有一个 ADB 命令可用于使给定的应用程序能够像以前的版本一样读取所有日志,但这必须从 ADB 发出 - 它不能由应用程序设置。

如果你想按照你所说的去做,不管缺乏必要性和实用性的迫在眉睫的限制,要做的事情是将连接到子进程的文件描述符的知识放入本机代码中。您可能能够传递它,或者本机代码可能能够自己发现它,因为所有文件描述符都列在 /proc 中。

于 2012-08-03T04:07:55.540 回答