142

我正在尝试开发一个简单的 android 应用程序,我在其中尝试使用sqlcipher,它在内部使用 .so 库。我已阅读有关如何将 sqlcipher 与 android app 一起使用的文档。我已经按照这些步骤进行了编译,并且没有任何错误。但是,在运行时它会抛出UnsatisfiedLinkError.

谷歌搜索,我发现gradle 还不支持 .so 库,但我在这里找到了一个我正在尝试使用的 hack 。但它会在要点的第 40 行抛出编译时错误,即,

tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}

在项目“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')
}

可以,任何人都可以帮助我解决我做错了什么,或者我应该怎么做才能将这些 .so 库包含在我的 apk 中?

由于我是 android 开发和 gradle 的新手,如果我误解了什么,请向我道歉。

4

3 回答 3

257

我已经尝试了接受的答案中提出的解决方案,但它对我不起作用。我想分享 DID 对我有用的东西,因为它可能对其他人有所帮助。我在这里找到了这个解决方案。

基本上你需要做的就是把你的.so文件放在一个名为的文件夹lib中(注意:它不是libs,这不是一个错误)。它应该与APK文件中的结构相同。

就我而言,它是:
项目:
|--lib:
|--|--armeabi:
|--|--|--.so 文件。

所以我创建了一个 lib 文件夹,并在其中创建了一个 armeabi 文件夹,我在其中插入了所有需要的 .so 文件。然后我将文件夹压缩到一个.zip(zip 文件中的结构现在是 lib/armeabi/*.so)我将.zip文件重命名为armeabi.jar并将该行添加compile fileTree(dir: 'libs', include: '*.jar')dependencies {}gradle 的构建文件中。

这以一种相当干净的方式解决了我的问题。

于 2013-06-16T08:20:55.277 回答
68

要包含您需要的本机库:

  1. 创建具有包含“.so”文件的特殊结构的“jar”文件;
  2. 将该文件包含在依赖项列表中。

要创建 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')
于 2013-07-31T15:30:27.793 回答
28

我有同样的问题。查看https://gist.github.com/khernyo/4226923#comment-812526中的评论

它说:

对于 gradle android 插件 v0.3 使用“com.android.build.gradle.tasks.PackageApplication”

那应该可以解决您的问题。

于 2013-05-22T17:14:45.383 回答