android - 无法在 Android 上原生使用 'libnl'。无法使用 `genl_ctrl_resolve()` 获取 nl80211 驱动程序

标签 android android-ndk ndk-build netlink wifi

我的目标是使用 libnl在 Android 应用程序中获取在最新网络扫描中接收到的信标帧列表并打印(显示)关联的元数据,例如 AP SSID、AP BSSID 等...

遵循基本教程和指南,方法似乎是:

  1. 为所有受支持的 Android ABI 交叉编译 libnl,因为 libnl 带有自己的 ./configureMakefile
  2. 在我的 native C/C++ 代码中将已编译的存档导入为 PREBUILT_STATIC_LIBRARYPREBUILT_SHARED_LIBRARY
  3. 在 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

  1. 交叉编译:
    我已经能够为所有 ABI(armeabi-v7aarm64-v8ax86x86_64) 使用记录的 NDK 独立工具链方法 here .这为我提供了库的 .a 编译文件。

  2. 导入库并编译:
    这是严格按照 Google (github) 的代码示例完成的 - 特别是“hello-libs”示例。

注意:我推断第 1 步和第 2 步已正确完成,因为当我编译和运行应用程序时,该库已成功链接到我的 C/C++ 源代码。此外,我能够从我的 C/C++ 源代码中调用 libnl 方法。我没有得到 UnsatisfiedLinkErrorUndefined Reference to ...

  1. 像在 Linux 中一样使用 libnl 方法
    我已将问题调试到使用 libnl 方法 genl_ctrl_resolve 获取 nl80211 驱动程序的 driverId 的语句。这将返回错误代码 -12,意思是“找不到对象”。

    ...
    struct nl_sock *socket = init_socket();
    driver_id = genl_ctrl_resolve(socket, "nl80211");
    ...
    

我的具体疑问是:

  1. 我的方法正确吗?如果没有,我们将不胜感激任何帮助或见解。
  2. 是否有任何替代方法?
  3. 我的应用程序是否需要 root 访问权限才能获取驱动程序 ID?
  4. 任何学习原生 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/

相关文章:

android - CampaignTrackingService 服务有无法启动的风险

android - NDK12b : Different ELF produced by clang vs gcc using the standalone toolchain and the same build scripts

android - 如何通过 Ndk-build 静态构建可执行文件?

java - Android Java - 为什么不扩展 Activity -> 新 Activity

java - 在 Android 中未收到解析推送通知

java - 我收到错误隐式 super 构造函数 SQLiteOpenHelper()

Android ndk 将 OpenCV mat 传递给包含 double 值的 jni

android - 从源代码构建 Android 时如何查看实际的 gcc 选项?

android - 来自 "adb shell dumpsys meminfo my-app-name"的配置文件的详细说明?

android - ndk-build 在构建大型项目时卡住/挂起