android - 在android ndk中使用c代码打开文件时管道返回null

标签 android c android-ndk pipe

我正在尝试向我的 android 应用程序编写一些 native 代码,该应用程序使用 2 个文件管道在 java 代码和 native 代码之间进行通信。最终的目标是让 native 代码通过网络进行通信,而 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。

关于android - 在android ndk中使用c代码打开文件时管道返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914812/

相关文章:

c - BST 实现

c - sqrt() 函数链接错误

Android - 未定义对 cryptopp 的引用

c++ - 具有大特征向量 LibSVM 的段错误

android - 为什么 ndk-build 会生成两个不同的库,一个很大,一个较小?

android - 避免取消从最近的应用程序列表中删除应用程序的通知

android - 将 .db 转换为 .vcf

java - OkHttp 3.11 和 TLS 1.2 支持

c - 带无符号分子的有符号除法

java - 获取空对象 - 将数据从一个 Activity 发送到另一个 Activity