从JNI库重定向输出

时间:2011-10-06 16:50:53

标签: android java-native-interface

我正在寻找一种在简单的Android应用中重定向/捕获本机库的stdout输出的方法。我已经看到了几个帖子,但我找不到问题的答案。

我希望尽可能避免修改现有的本机库。我的第一个冲动是使用fifo文件并重定向本机库的输出。我似乎无法通过对Runtime.getRuntime()。exec(“mkfifo(,0666)”)的调用。我正在尝试在/ data / data /中创建文件,但程序运行后该文件似乎不存在。我似乎也无法在Android文件系统中找到'mkfifo'(通过adb shell)。

几个愚蠢的问题: - mkfifo在哪里? - 我是否能够在程序运行后看到fifo文件,或者在运行上述命令后是否有更可靠的方法来测试fifo的存在? - 还有其他/更好的方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您想将其专门重定向到文件吗?然后你可能想做的是:

int fd = open(filename, "w");
dup2(fd, 1);
close(fd);

我不知道这将如何影响Java子系统。

另请注意,/data/data可能无法写入。应用程序沙箱位于/data/data/com.mypackage/下,Android希望您通过Context.getDir()为您的数据创建子目录。 /sdcard始终可写,但您必须先检查可用性 - 根据定义,卡是可移动存储。

如果重定向到文件不是您的最终愿望,那么pipe()可能是更好的选择。 {1}将写入结束为1,并从读取结束读取,最好是在不同的线程中。然后由您决定如何处理数据。

答案 1 :(得分:0)

在你的情况下这很容易:

Process process = Runtime.getRuntime().exec(cmd);
InputStream processOut = process.getInputStream();
InputStream processError = process.getErrorStream();

但我找不到自己的解决方案。我有java库将其内容放入一个文件(由String fileNameFileDescriptor fd标识)。还有一个本地图书馆。我需要将输出从第一个重定向到第二个库的输入。我认为fifo是一个解决方案,但 android文件系统是fat32,不能有FIFO文件