gpt4 book ai didi

java - 从 Java 运行进程,使用 C++ 的输出

转载 作者:搜寻专家 更新时间:2023-11-01 09:06:08 25 4
gpt4 key购买 nike

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

:我正在为 Android 试验一个日志阅读器应用程序。为此,我必须运行 logcat 命令并解析其输出。我已经从 Java 尝试过这个,但是执行的内存分配量不仅使进程非常慢,而且还用大量 GC 弄乱了同一个日志相关条目。

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

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

最佳答案

你的前提有点错误:fork/exec() 在 Android 上从 Java 完成时并不比通过 NDK 完成时更“合适” - 在这两种情况下它今天都可以工作,但被认为是不合适的Android 应用程序应该可以运行。

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

如果你想按字面意思去做你所说的,不管实用程序的缺乏必要性和迫在眉睫的限制,要做的事情就是将连接到子进程的文件描述符的知识获取到 native 代码中。您可以传递它,或者 native 代码可以自己发现它,因为所有文件描述符都列在/proc 中。

关于java - 从 Java 运行进程,使用 C++ 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11789092/

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