我的目标是使用 libnl在 Android 应用程序中获取在最新网络扫描中接收到的信标帧列表并打印(显示)关联的元数据,例如 AP SSID、AP BSSID 等...
遵循基本教程和指南,方法似乎是:
- 为所有受支持的 Android ABI 交叉编译 libnl,因为 libnl 带有自己的
./configure
和Makefile
- 在我的 native C/C++ 代码中将已编译的存档导入为
PREBUILT_STATIC_LIBRARY
或PREBUILT_SHARED_LIBRARY
- 在 native 代码中使用 libnl 方法
开发环境和配置:
- IDE:Android Studio 3.1.2
- NDK 版本:Android NDK 修订版 17b
- 外部工具:Gradle、CMake
- MinSDK 版本:API 14
- 目标 SDK 版本:API 21
- 库源:Libnl 3.2.25 - link
- 操作系统:Ubuntu 18.04 LTS
交叉编译:
我已经能够为所有 ABI(armeabi-v7a
、arm64-v8a
、x86
、x86_64
) 使用记录的 NDK 独立工具链方法 here .这为我提供了库的.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? - 任何学习原生 Android 开发的好资源。
感谢任何帮助。 感谢您的期待。
附言..
- 我浏览了 Android 开发者网站
- 我一直在引用
Sylvain Ratabouil 的《Android NDK 初学者指南》
和Herve´ Guihot 的《Pro Android Apps Performance Optimization》
- 还尝试使用 Eclipse (ADT) 和旧版 SDK (r24.4.1)、NDK (r10e) 从头构建项目
最佳答案
如果 libnl 需要对 /dev 或 /proc 的读取权限,您可以忘记在没有开启Root的设备上从 NDK 访问它。
谷歌已经从几个版本中取缔了 Android,从 Android 7 开始,严禁在 APK 安装目录之外进行所有读取访问,因为应用程序需要通过 SAF 间接读取文件。
https://developer.android.com/about/versions/nougat/android-7.0-changes#permfilesys
https://developer.android.com/guide/topics/providers/document-provider
更好的方法是使用框架 network interfaces通过 JNI。
关于android - 无法在 Android 上原生使用 'libnl'。无法使用 `genl_ctrl_resolve()` 获取 nl80211 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51506590/