Nexus7 не может загрузить собственную библиотеку

Я пытаюсь создать собственные библиотеки (в моем случае SQLite), чтобы добавить их в свой проект Android.

Моя проблема: Мой Nexus7 с Android 6.0.1 пытается загрузить его с пути ../lib/arm/libsqlite3.so. Но этого пути не существует.

С начала:

  1. Я скачал sqlite-amalgamation-3310100.zip

  2. В этой папке я создал файл CMakeLists.txt с таким содержимым:

cmake_minimum_required(VERSION 3.4.1)

add_definitions(-DSQLITE_DQS=0)
add_definitions(-DSQLITE_DEFAULT_MEMSTATUS=0)
add_definitions(-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1)
add_definitions(-DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1)
add_definitions(-DSQLITE_MAX_EXPR_DEPTH=0)
add_definitions(-DSQLITE_OMIT_DECLTYPE=1)
add_definitions(-DSQLITE_OMIT_DEPRECATED=1)
add_definitions(-DSQLITE_OMIT_PROGRESS_CALLBACK=1)
add_definitions(-DSQLITE_USE_ALLOCA=1)

add_library(
    # Specifies the name of the library.
    sqlite3

    # Sets the library as a shared library.
    SHARED

    # Provides a relative path to your source file(s).
    shell.c
    sqlite3.c
    sqlite3.h
    sqlite3ext.h
)

  1. Я создал библиотеку с помощью этой команды (за которой следует make):
~/development/sdks/android-sdk/cmake/3.10.2.4988404/bin/cmake \
    -DANDROID_NDK=~/development/sdks/android-sdk/ndk/21.0.6113669 \
    -DCMAKE_TOOLCHAIN_FILE=~/development/sdks/android-sdk/ndk/21.0.6113669/build/cmake/android.toolchain.cmake \
    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=armeabi-v7a \
    -DANDROID_TOOLCHAIN=clang \
    -DANDROID_ABI=armeabi-v7a \
    -DANDROID_NATIVE_API_LEVEL=29

Я сделал это для этого 4 ABI: armeabi-v7a, arm64-v8a, x86 и x86_64.

После этого я скопировал файлы .so в папку app/src/main/jniLibs/<abi>, структура папки выглядит так:

.
├── app
│   └── src
│       ├── main
│       │   ├── jniLibs
│       │   │   ├── arm64-v8a
│       │   │   │   └── libsqlite3.so
│       │   │   ├── armeabi-v7a
│       │   │   │   └── libsqlite3.so
│       │   │   ├── x86
│       │   │   │   └── libsqlite3.so
│       │   │   └── x86_64
│       │   │       └── libsqlite3.so

Теперь, когда я запускаю приложение, я получаю следующее сообщение об ошибке:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memcpy"
referenced by "/data/app/com.example.myapplication-2/lib/arm/libsqlite3.so"...

Почему Android пытается загрузить библиотеку из папки lib/arm, а не из папки lib/armeabi-v7a? Это работает, когда я делаю то же самое с другим устройством с Android 7.1.1.

Кстати, демо-проект Android Native Lib тоже работает. А когда смотрю в его апк, родная либа лежит в папке lib/armeabi-v7a. Так почему же это работает, когда Android Studio компилирует нативный код, но не работает, когда я добавляю предварительно скомпилированную нативную библиотеку?


person Ralph Bergmann    schedule 08.03.2020    source источник
comment
Почему вы устанавливаете ANDROID_NATIVE_API_LEVEL=29, если вы собираетесь запускать это на устройстве Android 6 (уровень API 23)? Установленное значение должно соответствовать вашему minSdkVersion.   -  person Michael    schedule 09.03.2020
comment
@Майкл, большое спасибо, ты спас мне жизнь :-)   -  person Ralph Bergmann    schedule 10.03.2020


Ответы (1)


Как писал Майкл, я должен установить правильный DANDROID_NATIVE_API_LEVEL. Чтобы запустить его на Android 6.0.1, мне нужно использовать уровень API 23 или ниже. Итак, команда cmake должна выглядеть так:

~/development/sdks/android-sdk/cmake/3.10.2.4988404/bin/cmake \
    -DANDROID_NDK=~/development/sdks/android-sdk/ndk/21.0.6113669 \
    -DCMAKE_TOOLCHAIN_FILE=~/development/sdks/android-sdk/ndk/21.0.6113669/build/cmake/android.toolchain.cmake \
    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=armeabi-v7a \
    -DANDROID_TOOLCHAIN=clang \
    -DANDROID_ABI=armeabi-v7a \
    -DANDROID_NATIVE_API_LEVEL=19
person Ralph Bergmann    schedule 14.03.2020