我正在为 Android 编写一个应用程序,它传递从 ParcelFileDescriptor.getFd() 获取的 JAVA fd,根据 [1] 指出我返回的 int 是本机 fd。
现在,有了这个 fd,我试图通过一个 unix 域套接字将它写入正在侦听的现有进程。为此,我使用 JNI,并将上面收到的 int 作为名为fdToSend的参数传递给 JNI 函数。
当我的 JNI 代码尝试调用 sendmsg() 时,会出现一个错误,指出“错误的文件号”。
在谷歌的帮助下,当我调用 sendmsg() 时,似乎套接字连接可能会关闭,但我看不出会是怎样的情况。
sendfd() 方法与 [2] 中的完全相同。
下面是我的桥接 JNI 函数:
JNIEXPORT jint JNICALL Java_com_example_myapp_AppManager_bridgeSendFd(JNIEnv *env, jint fdToSend) {
int fd;
struct sockaddr_un addr;
if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
__android_log_print(ANDROID_LOG_ERROR, APPNAME, "socket() failed: %s (socket fd = %d)\n", strerror(errno), fd);
return (jint)-1;
}
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/data/data/com.example.myapp/sock_path", sizeof(addr.sun_path)-1);
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
__android_log_print(ANDROID_LOG_ERROR, APPNAME, "connect() failed: %s (fd = %d)\n", strerror(errno), fd);
return (jint)-1;
}
return (jint)sendfd(fd, (int)fdToSend);
}
[1] http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#getFd()