添加" .so"库到我的android工作室项目

时间:2014-11-13 18:56:08

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

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

  1. 原生的spaceite库:它们位于我的App目录中名为libs的文件夹中,包含用于保存主库的不同平台的几个文件夹,名为libspatialite.so

  2. 基本API类,包含在jsqlite包

  3. 尽管如此,我收到了这个错误:

    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 个答案:

答案 0 :(得分:1)

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

  • ARM
  • ARM-NEON
  • 86
  • MIPS

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

答案 1 :(得分:1)

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

使用Android Studio,删除.so文件的位置与使用eclipse相同。现在它位于jniLibs/<ABI>里面,其中ABI可以是 armeabi armeabi-v7a x86 x86_64 < / em>, mips mips64 arm64-v8a

您可以通过将APK作为zip文件打开并检查您的.so文件是否位于lib/<abi>个文件夹中来检查您的.so文件是否已正确集成。