Я пытаюсь создать собственные библиотеки (в моем случае SQLite), чтобы добавить их в свой проект Android.
Моя проблема: Мой Nexus7 с Android 6.0.1 пытается загрузить его с пути ../lib/arm/libsqlite3.so
. Но этого пути не существует.
С начала:
Я скачал sqlite-amalgamation-3310100.zip
В этой папке я создал файл
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
)
- Я создал библиотеку с помощью этой команды (за которой следует
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 компилирует нативный код, но не работает, когда я добавляю предварительно скомпилированную нативную библиотеку?
ANDROID_NATIVE_API_LEVEL=29
, если вы собираетесь запускать это на устройстве Android 6 (уровень API 23)? Установленное значение должно соответствовать вашемуminSdkVersion
. - person Michael   schedule 09.03.2020