我正在尝试开发一个简单的Android应用程序,我试图在其中使用sqlcipher,它在内部使用.so库。我已阅读how to use sqlcipher with android app上的文档。我已按照步骤进行编译,没有任何错误。但是,在运行时它会抛出UnsatisfiedLinkError
。
在Google上搜索,我发现gradle doesn't support .so libraries yet,但我找到了一个我正在尝试使用的黑客here。但它会在gist的第40行抛出编译时错误,
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
说
无法在Project'MyProject'上找到属性'com'
我在这里发布build.gradle文件中的代码。
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
dependencies {
compile files('libs/android-support-v4.jar')
compile files('libs/commons-codec.jar')
compile files('libs/guava-r09.jar')
compile files('libs/sqlcipher.jar')
}
targetCompatibility = 1.6
sourceCompatibility = 1.6
android {
target = 'android-14'
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 9
targetSdkVersion 16
}
}
task copyNativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
可以,任何人都可以帮助我解决我做错了什么或者我该怎么做才能在我的apk中包含那些.so库?
由于我是Android开发和gradle的新手,如果我误解了某些内容,请向我道歉。
答案 0 :(得分:255)
我已经尝试了在接受的答案中提出的解决方案,但它对我不起作用。 我想分享一下DID对我有用,因为它可能会帮助别人。我找到了这个解决方案here。
基本上您需要做的是将.so
文件放在名为lib
的文件夹中(注意:它不是libs
,这不是错误)。它应该与APK
文件中的结构相同。
在我的情况下是:
项目:
| --lib:
| - | --armeabi:
| - | - | - 。so files。
所以我创建了一个lib文件夹,里面有一个armeabi文件夹,我插入了所有需要的.so文件。然后我将文件夹压缩成.zip
(zip文件中的结构现在是lib / armeabi / *。所以)我将.zip
文件重命名为armeabi.jar
并添加了行{{ 1}}进入gradle构建文件中的compile fileTree(dir: 'libs', include: '*.jar')
。
这以一种相当干净的方式解决了我的问题。
答案 1 :(得分:66)
要包含您需要的本机库:
要创建jar文件,请使用以下代码段:
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
要包含结果文件,请将以下行粘贴到“build.gradle”文件的“dependencies”部分:
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
答案 2 :(得分:27)
我遇到了同样的问题。查看https://gist.github.com/khernyo/4226923#comment-812526
中的评论它说:
for gradle android plugin v0.3使用“com.android.build.gradle.tasks.PackageApplication”
那应该解决你的问题。