我正在尝试向我的Android应用程序编写一些本机代码,该应用程序使用2个文件管道在Java代码和本机代码之间进行通信。最终目的是使本机代码通过网络进行通信,而java代码则仅侦听管道的两端是否有传入和传出数据。这是我从Java应用程序调用的代码:

JNIEXPORT void JNICALL Java_com_test_fdtest_Bindings_openSession(JNIEnv *env, jobject this)
{
int inpipe[2];
int outpipe[2];
FILE *in;
FILE *out;
if(pipe (inpipe)) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Unable to set up input pipe");
    return;
}
if(pipe (outpipe)) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Unable to set up output pipe");
    return;
}
in = fdopen(inpipe[0], "w");
out = fdopen(outpipe[1], "r");
if(in == NULL) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "input pipe null");

}
if(out == NULL) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "output pipe null");

}
}


由此我得到输出:

06-04 09:44:41.759: D/dalvikvm(1443): Trying to load lib /data/data/com.test.fdtest/lib/libfdtest.so 0x414955a8
06-04 09:44:41.789: D/dalvikvm(1443): Added shared lib /data/data/com.test.fdtest/lib/libfdtest.so 0x414955a8
06-04 09:44:41.789: D/NDK_BINDINGS(1443): input pipe null
06-04 09:44:41.799: D/NDK_BINDINGS(1443): output pipe null


这似乎很奇怪。似乎可以正常设置管道,但随后无法打开文件。这是此代码的根本错误吗,因为文档似乎表明这是可行的。

谢谢你的帮助

最佳答案

从手册页:

pipefd[0] refers to the read end of the pipe.  pipefd[1] refers to the
write end of the pipe.


您试图打开inpipe的读取端进行写入,并打开outpipe的写入端进行读取。如果打印errno,则可能会看到EACCES。

10-07 19:20
查看更多