我的目标是在Android应用程序中使用libnl来获取在最新的网络扫描中接收到的信标帧列表,并打印(显示)关联的元数据,例如AP SSID,AP BSSID等... < / p>
按照基本的教程和指南,方法似乎是:
./configure
和Makefile
PREBUILT_STATIC_LIBRARY
或PREBUILT_SHARED_LIBRARY
的形式导入到本机C / C ++代码中开发环境和配置:
交叉编译:
使用here中记录的NDK独立工具链方法,我已经能够成功交叉编译所有ABI(armeabi-v7a
,arm64-v8a
,x86
,x86_64
的libnl 。这给了我.a
个库的编译文件。
导入库并进行编译:
这是紧跟Google(github)的代码示例(特别是“ hello-libs”示例)之后完成的。
注意 :我推断第1步和第2步正确完成,因为在编译和运行应用程序时,该库已成功链接到我的C / C ++源代码。此外,我能够从C / C ++源代码中调用libnl方法。我没有UnsatisfiedLinkError
或Undefined Reference to ...
。
在Linux中使用libnl方法
我已使用libnl方法genl_ctrl_resolve
将问题调试到语句中,以获取nl80211
驱动程序的driverId。这将返回错误代码-12
,表示“找不到对象”。
...
struct nl_sock *socket = init_socket();
driver_id = genl_ctrl_resolve(socket, "nl80211");
...
我的具体疑问是:
root
访问权限才能获得驱动程序ID? 感谢您的帮助。 谢谢您。
PS ..
Android NDK Beginner's Guide by Sylvain Ratabouil
和Pro Android Apps Performance Optimization by Herve´ Guihot
答案 0 :(得分:0)
如果libnl需要对 / dev 或 / proc 的读取访问权限,则您可以忘记从无根设备上的NDK访问它。
Google已从两个版本中禁止Android,从Android 7开始,由于必须要求应用程序通过SAF间接读取文件,因此严格禁止在APK安装目录之外进行所有读取访问。
https://developer.android.com/about/versions/nougat/android-7.0-changes#permfilesys
https://developer.android.com/guide/topics/providers/document-provider
更好的方法是通过JNI使用框架network interfaces。
答案 1 :(得分:0)
libnl通过套接字与内核对话。 您正在要求内核让您访问wifi的驱动程序界面。此时,了解设备正在使用哪个内核以及用于wifi的特定驱动程序将很重要。在Android上,这些是特定于制造商的,因此您不能依赖基于API级别的特定详细信息。
根据您提供的详细信息,我最大的猜测是: 1.内核正在理解您的查询 2.驱动程序没有nl80211接口。您可以试听无线扩展消息吗?
总而言之,无论API级别如何,它都可以在某些设备上运行,而不能在其他设备上运行。