android studio 中无法包含共享库
can't include shared library in android studio
我很难在 android studio 中包含我自己的 sqlite 库(libsqliteX.so):
我按照这个 guide and loaded this 并用最新的 android NDK (r10e) 编译它(我只是将 "APP_ABI := xxx" 添加到 Application.mk 以构建 x86 和 armeabi-它的 v7a 版本)并得到了这个:
控制台输出:s3.postimg.org/v83e8bwsz/ndk_build.jpg(不能 post 超过 2 个链接 :D)。
之后,我在 android studio (v1.2.1.1) 中创建了一个新应用程序,并创建了一个新的 jnilibs 文件夹,我在其中复制了我的 .so 文件:s17.postimg.org/7vvvsao67/jni_Libs.jpg
我没有更改 build.gradle(gradle 版本 1.2.3)或任何东西,只是编译了我的应用程序并且库包含在 apk 中(打开 ...[= 42=.apk with 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 会引发类似的错误(无法找到 class))
我应用了不同的方法使其工作(使 caches/restart 无效,从 .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 文件没有 package/folder 结构(如 "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
我很难在 android studio 中包含我自己的 sqlite 库(libsqliteX.so):
我按照这个 guide and loaded this 并用最新的 android NDK (r10e) 编译它(我只是将 "APP_ABI := xxx" 添加到 Application.mk 以构建 x86 和 armeabi-它的 v7a 版本)并得到了这个: 控制台输出:s3.postimg.org/v83e8bwsz/ndk_build.jpg(不能 post 超过 2 个链接 :D)。
之后,我在 android studio (v1.2.1.1) 中创建了一个新应用程序,并创建了一个新的 jnilibs 文件夹,我在其中复制了我的 .so 文件:s17.postimg.org/7vvvsao67/jni_Libs.jpg
我没有更改 build.gradle(gradle 版本 1.2.3)或任何东西,只是编译了我的应用程序并且库包含在 apk 中(打开 ...[= 42=.apk with 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 会引发类似的错误(无法找到 class))
我应用了不同的方法使其工作(使 caches/restart 无效,从 .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 文件没有 package/folder 结构(如 "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