我正在编写一个VPN应用程序,用于VPN连接的套接字是在本机C代码中处理的,而不是在Java中处理的。如何在该套接字上使用VpnService.protect()?我注意到它有一个VpnService.protect(int)重载,我可以将socket从本机代码返回的int返回到Java并以此方式进行保护吗?

示例

// Native Code
int socket;

JNIEXPORT jint JNICALL
Java_com_my_package_Class_initializeSocket
(
    JNIEnv *env,
    jobject jobj
) {
    socket = socket(AF_INET, SOCK_DGRAM, 0);

    // . . . Handler other socket preparations

    return (jint)socket;
}
// Java Code
public native int initializeSocket();

. . .

int socket = initializeSocket();
this.protect(socket);

编辑

我确实找到了this question,它描述了protect函数的工作方式,并且由于它似乎只是使用setsockopt调用,因此它似乎可以在C语言中实现非常简单的实现。但是我对C还是比较陌生,所以我不太了解如何复制它。

最佳答案

我只是想验证我的流程是否有效,在完成更多测试之后,我已经验证了它的有效性。

示例

// Native Code
int socket;

JNIEXPORT jint JNICALL
Java_com_my_package_Class_initializeSocket
(
    JNIEnv *env,
    jobject jobj
) {
    socket = socket(AF_INET, SOCK_DGRAM, 0);

    // . . . Handler other socket preparations

    return (jint)socket;
}
// Java Code
public native int initializeSocket();

. . .

int socket = initializeSocket();
this.protect(socket);

07-26 09:36