如何使用本机代码 C 在 android 上打开水龙头设备?
Posted
技术标签:
【中文标题】如何使用本机代码 C 在 android 上打开水龙头设备?【英文标题】:How to open tap device on android using native code C? 【发布时间】:2014-09-04 21:25:38 【问题描述】:我正在尝试为基于 android 的应用程序构建一个 *** 客户端移动设备,这些应用程序通过 *** 隧道连接到虚拟基础架构。我有一个类似的 Linux/Windows 应用程序,我知道如何打开 tun/tap 设备(打开 /dev/net/tun)。我们如何使用 C 为 Android 做同样的事情?
另外,android.net API 中的 ***Service 类究竟做了什么?
【问题讨论】:
【参考方案1】:如果你还想在android-native C上打开一个隧道,我建议看看android本身是如何打开它的(来自文件:services/jni/com_android_server_connectivity_***.cpp)
static int create_interface(int mtu)
int tun = open("/dev/tun", O_RDWR | O_NONBLOCK);
ifreq ifr4;
memset(&ifr4, 0, sizeof(ifr4));
// Allocate interface.
ifr4.ifr_flags = IFF_TUN | IFF_NO_PI;
if (ioctl(tun, TUNSETIFF, &ifr4))
ALOGE("Cannot allocate TUN: %s", strerror(errno));
goto error;
// Activate interface.
ifr4.ifr_flags = IFF_UP;
if (ioctl(inet4, SIOCSIFFLAGS, &ifr4))
ALOGE("Cannot activate %s: %s", ifr4.ifr_name, strerror(errno));
goto error;
// Set MTU if it is specified.
ifr4.ifr_mtu = mtu;
if (mtu > 0 && ioctl(inet4, SIOCSIFMTU, &ifr4))
ALOGE("Cannot set MTU on %s: %s", ifr4.ifr_name, strerror(errno));
goto error;
return tun;
error:
close(tun);
return SYSTEM_ERROR;
【讨论】:
【参考方案2】:***Service 类完全符合您的需要。它提供对 tun 设备的访问。如果没有 root 权限,您无法直接打开 /dev/net/tun。请参阅 Toy*** 示例项目或 Open*** for Android 等开源 *** 项目。
【讨论】:
是的,我确实检查了这些应用程序。我还检查了一个应用程序“Open*** Client”。在对其和类似应用程序的描述中,他们提到“不需要 root 访问权限,因为 *** tun 设备是使用 Android 4.0 (ICS) 引入的 ***Service API 处理的。还提供 Tap 设备支持。”那么 ***Service 类是否也提供 Tap 支持而无需 root 设备? 不仅是 tun。点击查看适用于 Android 的 Open*** 的常见问题解答。基本上你可以用 tun 设备来模拟 tap,但你已经写了一个小包装器/花钱请人写它 所以我能够建立 *** 连接,获得参数(IP 地址、DNS 服务器地址等)。此外,当我尝试通过 builder.establish 方法使用这些参数创建接口时,我收到以下错误。 java.lang.IllegalStateException: command '88 interface fwmark rule add tun0' failed with '400 88 Failed to add fwmark rule (No such device)' 我没有root权限,我读到的错误是我们不需要root权限有权访问 tun 设备。那么为什么我无法启动设备呢?我错过了什么? 简而言之,设备损坏。 4.4er 模拟器也坏了。 那么解决方法或解决方案是什么?非常感谢您的见解..以上是关于如何使用本机代码 C 在 android 上打开水龙头设备?的主要内容,如果未能解决你的问题,请参考以下文章
Firemonkey:如何从我的应用程序中打开本机 IOS 地图?
如何在主页中打开后退按钮 android 以退出应用程序并关闭反应本机导航侧菜单