2012-08-03 34 views
2

消耗输出:什么是从的Java调用一个过程,其输出经由JNI调用的C++功能消耗的最佳方式。运行过程从Java,C++中

:我正在试验日志阅读器应用程序Android。为此,我必须运行logcat命令并解析其输出。我试图从Java,但执行的内存分配的数量,这样不仅使过程非常慢,但它也混杂在相同的日志与大量的GC相关的条目。

因此,我已经在C++中实现了所有与解析相关的操作。然而,我不能使用惯用的fork/exec成语来调用logcatC++方面,因为它不真的支持NDK。相反,我需要从Java开始该过程,并以某种方式使其输出可以被C++代码访问。理想情况下,我会为此使用管道,但ProcessBuilderredirectOutput方法不适用于Android

我已经提出了迄今最好的解决方法是启动过程(使用logcat > tempfile)其输出重定向到一个临时文件中,并且具有从该文件中读出的C++代码。但是,这远非理想。有没有更好的方式让本地代码访问从Java开始的进程的输出?

回答

3

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

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

如果您希望从字面上理解您所说的内容,不管缺少必要性和即将出现的实用程序限制,要做的事情就是将连接到子进程的文件描述符的知识写入本机代码。您可能可以传递它,或者本机代码可以自己发现它,因为所有文件描述符都列在/ proc中。

+0

这些都是好点。我并不知道4.1中引入的限制。我的理解是,从NDK开始的过程中的问题是Dalvik不知道它们。 – 2012-08-03 19:15:21