【发布时间】:2017-11-12 17:23:35
【问题描述】:
我正在编写一个 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);
编辑
我确实找到了描述protect 函数如何工作的this question,看起来它可能在C 中有一个非常简单的实现,因为它看起来只是使用setsockopt 调用。但我对 C 语言也比较陌生,所以我不太了解如何复制它。
【问题讨论】:
-
我不明白这些
VpnService.protect()方法的作用。他们是否将套接字 保留在 VPN 之外? -
@nandsito 阅读了这篇文章,它解释了他们的工作:developer.android.com/reference/android/net/…
-
对于你的问题,我想你可以像你提到的那样做。我不建议在 C 中执行此操作(
setsockopt的东西),因为它会使用私有 API(除了非常难)。如果你希望你可以从 C 调用 Java 代码,那么你可以直接从 C 代码调用VpnService.protect(int),提高封装性 -
@nandsito 我无法避免套接字在 C 中。不幸的是,我使用的库处理套接字并且它是用 C 编写的。不过我确实可以访问套接字。
-
对不起,我对我的评论进行了修改。可以在 C 中打开套接字,但我不会调用
setsockopt。我要么在 JNI 调用之后在 Java 中调用VpnService.protect(int),要么直接在 JNI 中调用VpnService.protect(int)
标签: java android c sockets android-vpn-service