Nano Hash - криптовалюты, майнинг, программирование

java.lang.UnsatisfiedLinkError: ошибка dlopen: библиотека /Пользователи/ не найдена

Я хочу добавить еще одну библиотеку в пример android-ndk hello-libs.

В CMakeLists.txt я добавляю:

# this is from the hello-libs sample code
add_library(lib_gperf SHARED IMPORTED)
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)

########## I add this after the sample code:  ###########
add_library(lib_py SHARED IMPORTED)
set_target_properties(lib_py PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libpython.so)

И это:

target_link_libraries(
        hello-libs
        android
        lib_gperf

        #### this line ######
        lib_py

        log)

И скопируйте libpython.so в каталог, где находится libgperf.so:

Также скопируйте заголовки python в каталог include:

введите здесь описание изображения

Когда я нажимаю кнопку запуска:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib/arm64-v8a/libpython.so" not found
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)
        at com.example.hellolibs.MainActivity.<clinit>(MainActivity.java:36)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2747)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2931)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1620)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:173)
        at android.app.ActivityThread.main(ActivityThread.java:6698)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)

Путь существует на моем компьютере, но почему apk использует путь моего компьютера, а не путь устройства Android?

И я использую проводник Android-устройства, библиотека находится в каталоге:

введите здесь описание изображения

Тогда как я могу заставить apk использовать правильный путь?

Или я что-то пропустил, чтобы добавить?



Ответы:


1

Я столкнулся с точно такой же проблемой и обнаружил, что при построении файла .so ссылка на библиотеку python неверна, а ссылка на библиотеку gperf в порядке.
Ошибка ссылки для библиотеки Python
Обе библиотеки импортируются одним и тем же методом в cmake, поэтому это не имеет смысла.< br> Мой друг сказал мне, что это ошибка ниндзя, и они предоставили мне "обратное" решение. Вы должны импортировать библиотеку python, как если бы она была предоставлена ​​​​Android-NDK (например, Android или Log).

Библиотеку нужно положить в библиотеки NDK, которые должны находиться по адресу <NDK PATH>/toolchains/llvm/prebuilt/<OS_related_folder>/sysroot/usr/lib/<ABI targeted>/<minSdkVersion/

Где:
- NDK path — это расположение вашей папки NDK.
OS_related_folder — это папка с именем os_named (в моем случае windows-x86_64).
ABI target — это ABI, для которого скомпилирована ваша библиотека ( arm-linux-androideabi, aarch64-linux-android и т. д.).
- minSdkVersion – это номер минимальной версии SDK вашего проекта.
Эта информация была найдена в CMakeCache.txt в папке `\app.cxx. \cmake\отладка\\'. При использовании find_library для журнала отображается путь к библиотеке

Измените CMakeLists.txt, чтобы включить только библиотеку, и напрямую свяжите библиотеку по ее имени (python2.7 для libpython2.7.so)

cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib SHARED native-lib.cpp)

include_directories( ${CMAKE_CURRENT_LIST_DIR}/../../../libs/python/include/ )

find_library( log-lib log ) # Optional

target_link_libraries( native-lib python2.7 ${log-lib} )

Поскольку библиотека python изначально не предоставляется Android, вам нужно будет упаковать ее в APK, изменив папки jnLibs (см. документация)

Выполнение этих шагов должно устранить проблему Результирующая ссылка на библиотеку в файле .so

Очевидно, что это не очень хорошее решение. Я надеюсь, что мой ответ привлечет больше внимания к этой проблеме, и кто-нибудь предложит реальное решение, чтобы избежать таких настроек.

06.09.2019
  • У меня такая же проблема, и я не могу решить этот подход. Есть ли другие решения? Может ли проблема быть вызвана самим файлом .so? 17.12.2019
  • Я считаю, что место для размещения .so неверно. Раньше я помещал его в ndk-bundle/platforms/android-‹версия сборки›/‹android abi›/usr/lib/, но с недавним обновлением обновления Android местоположение изменилось. Я больше не компилирую libpython через Android Studio, поэтому не могу протестировать его самостоятельно. Не могли бы вы попробовать и сообщить о результате? 08.01.2020
  • Я создал новый проект и повторил весь процесс. Расположение файла: ‹Android-SDK-Location›\‹NDK-Bundle›\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\lib\‹Android ABI›\‹minSdkVersion› Если вы не уверены того, куда поместить библиотеку, добавьте журнал как требование и проверьте CMakeCache.txt в папке .cxx/cmake/debug/‹ABI›. Будет указан путь к библиотеке журналов, сюда вы должны поместить свою библиотеку 08.01.2020
  • Спасибо, Павел, за полное объяснение. Попробую отпишусь о результате. 11.01.2020

  • 2

    Предположим, что путь /Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib правильный, тогда вы можете настроить свои библиотеки JNI, как показано ниже:

    sourceSets {
        release {
            jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
        }
        debug {
            jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
        }
    }    
    

    Попробуйте изменить /Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib, если это не правильный путь к библиотекам jni.

    11.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..