我正在编写一个适用于Android的应用程序,该应用程序将传递一个从ParcelFileDescriptor.getFd()中获取的JAVA fd,该文件根据[1]指出我返回的int是 native fd。
现在,借助此fd,我试图通过unix域套接字将其写入到正在监听的现有进程中。为此,我正在使用JNI,并将上面收到的int作为名为 fdToSend 的参数传递给JNI函数。
当我的JNI代码尝试调用sendmsg()时,会出现错误,指出“错误的文件编号”。
在google的一些帮助下,当我调用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()
[2] https://stackoverflow.com/a/4491203/2796346
最佳答案
原来的问题是JNI函数声明。
第一个arg是JNIEnv,第二个是jclass THEN,它是从Java传入的值(即对我来说是fdToSend)。
因此,我的猜测是,由于我正在使用第二个arg(应该是jclass),所以我可能会得到一个内存引用或类似的东西。
如此处所示:https://stackoverflow.com/a/10743451/2796346
关于android - 使用JNI通过UNIX域套接字发送Java FD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19209431/