Добавление библиотеки ".so" в мой проект студии android

У меня возникают проблемы, когда я пытаюсь добавить пространственную базу данных в свой проект Android Studio. Я следовал этому руководству https://www.gaia-gis.it/fossil/libspatialite/wiki?name=spatialite-android-tutorial, как уже упоминалось я добавил две папки в свой проект:

  1. нативные библиотеки пространственных объектов: они расположены в папке с именем libs в моем каталоге приложений и содержат несколько папок для разных платформ, содержащих основную библиотеку, которая называется libspatialite.so

  2. основные классы API, содержащиеся в пакете jsqlite

Несмотря на это, я получаю эту ошибку:

11-13 13:52:17.358    1853-1853/liara.geodatamining W/System.err﹕ Unable to load sqlite_jni: java.lang.UnsatisfiedLinkError: Couldn't load proj from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/liara.geodatamining-2.apk"],nativeLibraryDirectories=[/data/app-lib/liara.geodatamining-2, /system/lib]]]: findLibrary returned null
11-13 13:52:17.358    1853-1853/liara.geodatamining W/dalvikvm﹕ No implementation found for native Ljsqlite/Database;.internal_init:()V
11-13 13:52:17.358    1853-1853/liara.geodatamining W/dalvikvm﹕ Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Ljsqlite/Database;
11-13 13:52:17.358    1853-1853/liara.geodatamining W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb2d19b20)
11-13 13:52:17.358    1853-1853/liara.geodatamining E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: liara.geodatamining, PID: 1853
    java.lang.UnsatisfiedLinkError: Native method not found: jsqlite.Database.internal_init:()V
            at jsqlite.Database.internal_init(Native Method)
            at jsqlite.Database.<clinit>(Database.java:951)
            at liara.geodatamining.map.onCreate(map.java:116)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)  

Я что-то пропустил?

2 ответа

Если вы используете только.so файлы и не компилируете какие-либо исходные коды C/C++ самостоятельно, вам не нужен NDK.

В Android Studio место, куда вы добавляете.so файлы, не то же самое, что и в Eclipse. Теперь это внутри jniLibs/<ABI> где ABI может быть armeabi, armeabi-v7a, x86, x86_64, mips, mips64, arm64-v8a.

Вы можете проверить правильность интеграции ваших.so-файлов, открыв APK в виде zip-файла и просто проверив, что ваши.so-файлы находятся внутри lib/<abi> папки.

Похоже, вы не включили соответствующую версию NDK для вашего эмулятора. Согласно документации для Android, следующие платформы поддерживают Android NDK

  • РУКА
  • ARM-NEON
  • x86
  • MIPS

Наиболее распространенным на сегодняшний день для реальных устройств является ARM (armeabi-v7a). На самом деле, вероятно, почти без потерь не включать ничего, кроме этого, в опубликованную сборку. Но эмуляторы часто работают от x86. Я знаю, что у меня есть файл NDK для x86, который я удаляю каждый раз, когда я готов к сборке для выпуска, и повторно добавляю, когда хочу использовать эмулятор рабочего стола.

Другие вопросы по тегам