Невозможно использовать «libnl» изначально на Android. Не удалось получить драйвер nl80211 с помощью `genl_ctrl_resolve ()`

Моя цель - использовать libnl в приложении Android для получения списка фейдеров маяка, полученных в последнем сетевом сканировании, и распечатать (отобразить) связанные метаданные, такие как AP SSID, AP BSSID и т. Д.

Следуя основным учебным пособиям и рекомендациям, подход выглядит следующим образом:

  1. Cross compile libnl для всех поддерживаемых Android ABI, поскольку libnl поставляется с собственными ./configureиMakefile
  2. Импортируйте скомпилированные архивы в мой собственный код C / C ++ как PREBUILT_STATIC_LIBRARYилиPREBUILT_SHARED_LIBRARY
  3. Использовать методы libnl в собственном коде

Окружающая среда и конфигурация Dev:

  • IDE : Android Studio 3.1.2
  • Версия NDK : версия NdK для Android Ndk 17b
  • Внешние инструменты : Gradle, CMake
  • Версия MinSDK : API 14
  • Целевая версия SDK : API 21
  • Библиотека Источник : Libnl 3.2.25 - ссылка
  • ОС : Ubuntu 18.04 LTS

  1. Крест компилирование:
    Я был в состоянии успешно кросс-компилятор libnl для все АБИСА ( armeabi-v7a, arm64-v8a, x86, x86_64) с использованием метода NDK Standalone компилированных инструментов документированного здесь . Это дает мне .aскомпилированные файлы для библиотеки.

  2. Импорт библиотек и компиляция:
    это было сделано в соответствии с примерами кода из Google ( github ) - в частности, примером «hello-libs».

ПРИМЕЧАНИЕ . Я делаю вывод, что шаги 1 и 2 выполняются правильно, потому что при компиляции и запуске приложения библиотека успешно связана с моим исходным кодом на C / C ++. Кроме того, я могу вызвать методы libnl из моего исходного кода на C / C ++. У меня нетUnsatisfiedLinkErrorилиUndefined Reference to ....

  1. Используя методы libnl, как в Linux,
    я отладил эту проблему с помощью метода libnl, genl_ctrl_resolveчтобы получить драйвер для nl80211драйвера. Это возвращает код ошибки, -12означающий «Объект не найден».

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

Мои особые сомнения:

  1. Правильно ли мой подход? Если нет, любая помощь или проницательность оценены.
  2. Есть ли альтернативный подход?
  3. Требуется ли моему приложению rootдоступ для получения идентификатора драйвера?
  4. Любые хорошие ресурсы для получения дополнительной информации о Native Android Development.

Любая помощь приветствуется. Благодарю вас в ожидании.


PS ..

  • Я прошел через сайт разработчика Android
  • Я имею в виду Android NDK Beginner's Guide by Sylvain RatabouilиPro Android Apps Performance Optimization by Herve? Guihot
  • Также попытался построить проект с нуля, используя Eclipse (ADT) и более старый SDK (r24.4.1), NDK (r10e)

android,android-ndk,ndk-build,netlink,802.11,

0

Ответов: 1


Окружающая среда и конфигурация Dev:

  • IDE : Android Studio 3.1.2
  • Версия NDK : версия NdK для Android Ndk 17b
  • Внешние инструменты : Gradle, CMake
  • Версия MinSDK : API 14
  • Целевая версия SDK : API 21
  • Библиотека Источник : Libnl 3.2.25 - ссылка
  • ОС : Ubuntu 18.04 LTS

  1. Крест компилирование:
    Я был в состоянии успешно кросс-компилятор libnl для все АБИСА ( armeabi-v7a, arm64-v8a, x86, x86_64) с использованием метода NDK Standalone компилированных инструментов документированного здесь . Это дает мне .aскомпилированные файлы для библиотеки.

  2. Импорт библиотек и компиляция:
    это было сделано в соответствии с примерами кода из Google ( github ) - в частности, примером «hello-libs».

ПРИМЕЧАНИЕ . Я делаю вывод, что шаги 1 и 2 выполняются правильно, потому что при компиляции и запуске приложения библиотека успешно связана с моим исходным кодом на C / C ++. Кроме того, я могу вызвать методы libnl из моего исходного кода на C / C ++. У меня нетUnsatisfiedLinkErrorилиUndefined Reference to ....

  1. Используя методы libnl, как в Linux,
    я отладил эту проблему с помощью метода libnl, genl_ctrl_resolveчтобы получить драйвер для nl80211драйвера. Это возвращает код ошибки, -12означающий «Объект не найден».

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

Мои особые сомнения:

  1. Правильно ли мой подход? Если нет, любая помощь или проницательность оценены.
  2. Есть ли альтернативный подход?
  3. Требуется ли моему приложению rootдоступ для получения идентификатора драйвера?
  4. Любые хорошие ресурсы для получения дополнительной информации о Native Android Development.

Любая помощь приветствуется. Благодарю вас в ожидании.


PS ..

  • Я прошел через сайт разработчика Android
  • Я имею в виду Android NDK Beginner's Guide by Sylvain RatabouilиPro Android Apps Performance Optimization by Herve? Guihot
  • Также попытался построить проект с нуля, используя Eclipse (ADT) и более старый SDK (r24.4.1), NDK (r10e)
10
0

Если libnl требует доступа для чтения к / dev или / proc, вы можете забыть о его доступе от NDK на неуправляемых устройствах.

Google запустил 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

Лучшим способом было бы использовать сетевые интерфейсы Framework через JNI.

андроид, андроид-NDK, НДК-сборки, NetLink, 802,11,
Похожие вопросы