java - 无法在 android studio 中包含共享库

标签 java android android-ndk

我很难在 android studio 中包含我自己的 sqlite 库(libsqliteX.so):

我关注了这个guide并加载this并使用最新的 android NDK (r10e) 编译它(我刚刚将“APP_ABI := xxx”添加到 Application.mk 以构建它的 x86 和 armeabi-v7a 版本)并得到以下结果: 控制台输出:s3.postimg.org/v83e8bwsz/ndk_build.jpg(不能发布超过 2 个链接:D)。

之后,我在 android studio (v1.2.1.1) 中创建了一个新应用程序,并创建了一个新的 jnilibs 文件夹,在其中复制了 .so 文件:s17.postimg.org/7vvvsao67/jni_Libs.jpg

我没有更改build.gradle(gradle版本1.2.3)或任何东西,只是编译了我的应用程序,并且库包含在apk中(打开.../app/build/outputs/apk/apk -debug.apk 带有 winzip,并且有一个包含 libsqliteX.so 文件的 lib 文件夹)。

但现在我不知道如何在我的项目中使用该库。我无法添加行 import org.sqlite.database...; (无法解析符号“sqlite”),我无法在项目结构 -> 依赖项中添加该库 (只有 build.gradle 中的默认依赖项存在:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:support-v4:22.1.1'

如果我只是使用 System.loadLibrary("sqliteX"); 加载库; 我在运行时遇到此错误:

05-29 03:21:54.248    3450-3450/com.example.thele.geostuff D/dalvikvm﹕ Added shared lib /data/app-lib/com.example.thele.geostuff-1/libsqliteX.so 0x416f6428
05-29 03:21:54.288    3450-3450/com.example.thele.geostuff E/SQLiteConnection﹕ Unable to find class org/sqlite/database/sqlite/SQLiteCustomFunction
05-29 03:21:54.288    3450-3450/com.example.thele.geostuff W/dalvikvm﹕ JNI WARNING: JNI method called with exception pending
05-29 03:21:54.288    3450-3450/com.example.thele.geostuff W/dalvikvm﹕ in Ljava/lang/Runtime;.nativeLoad:(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/String; (GetFieldID)
05-29 03:21:54.288    3450-3450/com.example.thele.geostuff W/dalvikvm﹕ Pending exception is:
05-29 03:21:54.297    3450-3450/com.example.thele.geostuff I/dalvikvm﹕ java.lang.NoClassDefFoundError: org/sqlite/database/sqlite/SQLiteCustomFunction

(将 dalvik 更改为 art 会引发类似的错误(找不到类))

我应用了不同的方法来使其工作(使缓存/重新启动无效、从 .so 文件创建一个 .jar 文件),但没有帮助。 我做错了什么?

<小时/>

编辑:

完整的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.thele.geostuff"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.android.support:support-v4:22.1.1'
}

最佳答案

对我来说错误

java.lang.NoClassDefFoundError: org/sqlite/database/sqlite/SQLiteCustomFunction

似乎是Java层错误,而不是C层错误。因为 *.c 文件没有包/文件夹结构(如“org/sqlite/database...”)。

所以我最好的猜测是,某些 .class 文件不在您的 apk 中。如果我是你,我会使用 7zip/winrar 解压 apk 并检查 org.sqlite.database.sqlite.SQLiteCustomFunction 是否存在。

实际上,我相信.so已成功加载。

Added shared lib /data/app-lib/com.example.thele.geostuff-1/libsqliteX.so 0x416f6428

关于java - 无法在 android studio 中包含共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524590/

相关文章:

php - 如何使用 volley api 将 android 应用程序连接到本地服务器

c++ - Android.mk - 包含 OpenCV 目录,用于使用 NDK 进行 native C++ 编译

android - NDK 使用未声明的标识符 memcpy

java - 线程连接自身

java - Spring Boot OAuth 总是重定向到 HTTP(IBM Cloud CF + Spring Boot 2)

javascript - 后退按钮过滤器不起作用

安卓 : How to create a view using canvas then use this view in activity

安卓市场文本格式

java - NDK 功能不起作用

java - org.XML.sax.SAXParseException : Unexpected token (position:TEXT @1:2 in java. io.StringReader@959e0aa)