Trong khi xây dựng iw phiên bản 3.11 (đã có tệp Android.mk), tôi gặp phải một số vấn đề do thiếu/sai tiêu đề và thư viện. Vì nó có tệp Android.mk, NDK có thể được sử dụng.
Trong sau tôi sẽ giả định như sau:
- Một hình ảnh thiết bị đã được xây dựng trước (kernel header và libnl-2 thư viện tĩnh ít nhất nên có sẵn). Tôi đã xây dựng CyanogenMod 10 (với kernel 3.0.something) cho i9300, cập nhật các đường dẫn bên dưới để phản ánh điều đó.
- NDK được cài đặt thành
~/android/system/ndk
.
- NDK có các nền tảng và khung công cụ thích hợp được cài đặt.
Chuẩn bị sau khi giải nén iw-3.11.tar.xz
và thay đổi thư mục của tôi trong đó:
ln -s . jni
ln -nsv ~/android/system/external ./
Vấn đề tiếp theo là thư viện 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.
Đơn giản chỉ cần tạo ra một liên kết đến android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux
phá vỡ tiêu đề khác nặng sẽ cung cấp các lỗi như:
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
Một cách giải quyết là để tạo ra các thư mục linux
và đặt một liên kết tượng trưng đến ~/android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux/genetlink.h
trong đó:
mkdir -p linux
ln -svn ~/android/system/out/target/product/i9300/obj/KERNEL_OBJ/usr/include/linux/genetlink.h linux/
Cuối cùng vá Android.mk
để kết thúc liên kết đến các thư viện netlink:
sed "/LOCAL_LDFLAGS/s#\$# -L$HOME/android/system/out/target/product/i9300/obj/STATIC_LIBRARIES/libnl_2_intermediates -lnl_2#" -i Android.mk
Bây giờ xây dựng có thể bắt đầu:
NDK_PROJECT_PATH=$PWD ~/android/system/ndk/ndk-build TARGET_PLATFORM=android-14
Nó sẽ không hoàn thành vì netlink /genl/genl.h không thể tìm thấy, nhưng mã nhị phân iw
có sẵn trong libs/armeabi!
Bạn đã thử nhị phân trên trang đó chưa? Nếu bạn muốn biên dịch nó từ chính thiết bị, nó sẽ khó hơn rất nhiều. Chắc chắn git không được cài đặt theo mặc định. – kabuko
@kabuko bạn có ý nghĩa gì về nhị phân? Nếu tôi cố gắng ubuntu làm việc trên thiết bị đầu cuối của mình, tôi cần cài đặt sdk android trên thiết bị đó, nhưng thiết bị sẽ hỗ trợ tính năng này như thế nào nếu tôi chỉ biên dịch nó trên máy ubuntu android sdk? – Hana90