Добавление библиотеки ".so" в мой проект студии android
У меня возникают проблемы, когда я пытаюсь добавить пространственную базу данных в свой проект Android Studio. Я следовал этому руководству https://www.gaia-gis.it/fossil/libspatialite/wiki?name=spatialite-android-tutorial, как уже упоминалось я добавил две папки в свой проект:
нативные библиотеки пространственных объектов: они расположены в папке с именем libs в моем каталоге приложений и содержат несколько папок для разных платформ, содержащих основную библиотеку, которая называется libspatialite.so
основные классы 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, который я удаляю каждый раз, когда я готов к сборке для выпуска, и повторно добавляю, когда хочу использовать эмулятор рабочего стола.