我需要在安卓 4.1 设备上安装 iw 无线包。但我不知道如何以及需要安装什么版本的软件包!!
它是否需要 linux 平台来执行此操作,或者在 adb shell 上为 android root 设备构建和安装就足够了。
我看到这个 link但是当我从 adb 终端执行此操作时,我看到 git 和一些 shell 未找到???怎么做?
好像没人知道??
最佳答案
在构建 iw 版本 3.11(已经有一个 Android.mk 文件)时,由于缺少/错误的 header 和库,我遇到了一些问题。因为它有一个Android.mk文件,所以可以使用NDK。
在下文中,我将假设以下内容:
- 之前已经构建了设备镜像(内核头文件和 libnl-2 静态库至少应该可用)。我为 i9300 构建了 CyanogenMod 10(内核 3.0.something),更新下面的路径以反射(reflect)这一点。
- NDK 安装到
~/android/system/ndk
。 - NDK 已安装适当的平台和工具链。
提取 iw-3.11.tar.xz
并更改其中的目录后的准备工作:
ln -s . jni
ln -nsv ~/android/system/external ./
下一期是netlink库:
In file included from external/libnl-headers/netlink/genl/genl.h:15:0,
from /tmp/and/iw/jni/iw.c:17:
external/libnl-headers/netlink/netlink.h:27:29: fatal error: linux/genetlink.h: No such file or directory.
简单地创建到 android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux
的链接会严重破坏其他 header ,这将导致错误,例如:
Compile thumb : iw <= iw.c
In file included from /home/user/android/system/ndk/platforms/android-14/arch-arm/usr/include/net/if.h:28:0,
from /tmp/and/iw/jni/iw.c:10:
/tmp/and/iw/jni/linux/if.h:178:19: error: field 'ifru_addr' has incomplete type
/tmp/and/iw/jni/linux/if.h:179:19: error: field 'ifru_dstaddr' has incomplete type
/tmp/and/iw/jni/linux/if.h:180:19: error: field 'ifru_broadaddr' has incomplete type
/tmp/and/iw/jni/linux/if.h:181:19: error: field 'ifru_netmask' has incomplete type
/tmp/and/iw/jni/linux/if.h:182:20: error: field 'ifru_hwaddr' has incomplete type
In file included from external/libnl-headers/netlink/netlink.h:20:0,
from external/libnl-headers/netlink/genl/genl.h:15,
from /tmp/and/iw/jni/iw.c:17:
/home/user/android/system/ndk/platforms/android-14/arch-arm/usr/include/sys/socket.h:74:44: warning: 'struct msghdr' declared inside parameter list [enabled by default]
/home/user/android/system/ndk/platforms/android-14/arch-arm/usr/include/sys/socket.h:74:44: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
/home/user/android/system/ndk/platforms/android-14/arch-arm/usr/include/sys/socket.h:75:38: warning: 'struct msghdr' declared inside parameter list [enabled by default]
In file included from external/libnl-headers/netlink/netlink.h:25:0,
from external/libnl-headers/netlink/genl/genl.h:15,
from /tmp/and/iw/jni/iw.c:17:
/tmp/and/iw/jni/linux/netlink.h:33:2: error: unknown type name 'sa_family_t'
In file included from external/libnl-headers/netlink/genl/genl.h:15:0,
from /tmp/and/iw/jni/iw.c:17:
external/libnl-headers/netlink/netlink.h:51:16: warning: 'struct msghdr' declared inside parameter list [enabled by default]
external/libnl-headers/netlink/netlink.h:54:19: warning: 'struct iovec' declared inside parameter list [enabled by default]
make: *** [/tmp/and/iw/obj/local/armeabi/objs/iw/iw.o] Error 1
解决方法是创建 linux
目录并将符号链接(symbolic link)放入 ~/android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux/genetlink.h
在里面:
mkdir -p linux
ln -svn ~/android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux/genetlink.h linux/
最后打补丁 Android.mk
完成对 netlink 库的链接:
sed "/LOCAL_LDFLAGS/s#\$# -L$HOME/android/system/out/target/product/i9300/obj/STATIC_LIBRARIES/libnl_2_intermediates -lnl_2#" -i Android.mk
现在可以开始构建了:
NDK_PROJECT_PATH=$PWD ~/android/system/ndk/ndk-build TARGET_PLATFORM=android-14
它不会完成,因为找不到 netlink/genl/genl.h,但是 iw
二进制文件在 libs/armeabi 中可用!
关于android - 为 android 4.1 设备编译和构建 “iw”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345229/