【问题标题】:Adding ".so" library to my android studio project将“.so”库添加到我的 android studio 项目中
【发布时间】:2014-11-13 18:56:08
【问题描述】:

当我尝试将空间数据库添加到我的 android studio projet 时遇到问题。我按照本教程 https://www.gaia-gis.it/fossil/libspatialite/wiki?name=spatialite-android-tutorial 进行操作,如上所述,我在我的项目中添加了两个文件夹:

  1. 本机 spatialite 库:它们位于我的 App 目录中名为 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)  

我错过了什么吗?

【问题讨论】:

  • 你在运行什么?
  • 什么设备,什么 ndk 构建?
  • android-ndk-r10d 。我正在使用模拟器进行调试(平台 4.4.2)
  • 哪个模拟器?默认?

标签: java android android-studio java-native-interface spatialite


【解决方案1】:

这听起来很像您没有为您的模拟器包含适当版本​​的 NDK。根据Android docs,以下平台支持Android NDK

  • ARM
  • ARM-NEON
  • x86
  • MIPS

目前最常见的真实设备是 ARM (armeabi-v7a)。实际上,对于已发布的构建,除了此之外不包含任何内容可能几乎没有损失。但是模拟器通常在 x86 上工作。我知道我有一个适用于 x86 的 NDK 文件,每次准备发布时我都会删除它,并在我想使用我的桌面模拟器时重新添加。

【讨论】:

  • x86 不仅被模拟器使用,越来越多的真实设备也在使用 x86 芯片(Google Nexus Player、Tesco Hudl 2、Samsung Galaxy Tab 3 10.1、Asus Zenfone 2、许多 Asus 平板电脑、 Lenovo P90、Dell Venues...),最好也保留这些库。
【解决方案2】:

如果您只使用 .so 文件而不自己编译任何 C/C++ 源代码,则不需要 NDK。

使用 Android Studio,放置 .so 文件的位置与使用 eclipse 不同。现在它在 jniLibs/&lt;ABI&gt; 里面,其中 ABI 可以是 armeabiarmeabi-v7ax86x86_64mipsmips64arm64-v8a

您可以通过将 APK 作为 zip 文件打开并检查 .so 文件是否在 lib/&lt;abi&gt; 文件夹中来检查您的 .so 文件是否正确集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多