当前位置: 首页 > 知识库问答 >
问题:

Android NDK与Unix域的LocalSocket通信

王棋
2023-03-14

我有Android应用程序,需要与我们的C++库建立unix域套接字连接(使用Android NDK)

public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING
#define ADDRESS     "/tmp/unix.str" /* ABSOLUTE PATH */
  struct sockaddr_un saun, fsaun;
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("server: socket");
        exit(1);
    }
    saun.sun_family = AF_UNIX;
    strcpy(saun.sun_path, ADDRESS);

如果可能,请分享任何例子

共有1个答案

施刚毅
2023-03-14

LocalSocket使用Linux抽象名称空间而不是文件系统。在C语言中,这些地址是通过在路径前预置“\0”来指定的。

const char name[] = "\0your.local.socket.address";
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;

// size-1 because abstract socket names are *not* null terminated
memcpy(addr.sun_path, name, sizeof(name) - 1);

还请注意,不应将sizeof(sockaddr_un)传递给bindsendto,因为“\0”字符后面的所有字节都被解释为抽象套接字名称。取而代之的是计算并传递真实大小:

int res = sendto(sock, &data, sizeof(data), 0,
                 (struct sockaddr const *) &addr,
                 sizeof(addr.sun_family) + sizeof(name) - 1);
 类似资料:
  • 我试图建立FFMPEG库为我的Android应用程序使用NDK。我已经从它的网站上下载了源代码,我想我构建了它(这是我第一次尝试使用NDK和ffmpeg)。我已经创建了一个文件,我正在使用它从Mac OS X上的命令行执行它。 首先,我知道我需要Android。mk文件,所以我可以在我的应用程序中使用构建的库,但我不知道如何做到这一点,原因我在上面告诉过你。在我运行android文件夹中有一些文件

  • 开发基于Android和iOS的应用程序,需要与运行在同一设备中的服务器进行通信。目前使用TCP环回连接与应用程序和服务器进行通信(应用程序用用户层编写,服务器用C++编写,使用Android NDK) 我想知道用Unix域套接字取代内部通信是否会提高性能?

  • 两年前,我在android-7(艾克蕾尔)上开发了一个增强现实框架。由于AR应用是计算密集型任务,我开发了一个JNI c库,Java活动使用它来渲染和注册虚拟环境。在Java中获得的传感器读数被传递给underline c库,以计算虚拟环境的注册。三维对象是通过从GLSurfaceView调用的本地绘制函数来呈现的。这导致了大量的JNI呼叫。 现在我想将应用程序移植到android-15(冰淇淋三

  • 我的Android应用在使用时崩溃 这是我收到的唯一明显的错误消息: 无法将堆栈跟踪写入/data/anr/跟踪。txt(6738中的5571):没有这样的文件或目录 libMySharedLib.so 是从 ndk-build 生成的。我正在使用powerVR SDK,因此我假设这个库是事先在内部加载的。 如果我将我的代码分离到一个不同的共享库中,我可以让它工作,但这违背了我的需要(所有数据、指

  • 这是一个普通的问题,但我在stackoverflow中找不到任何类似的问题来讨论Android SDK/NDK最近版本的解决方案。 我的目的是将Android NDK打包为apk文件。 所以: 我将Android NDK安装到 /opt目录-称为 /opt/. 和cd /opt//样本/哪里是任何示例。 然后输入/opt//ndk-build,就编译好了: /opt/Android-SDK-Lin