在Android工作室的apk中包含.so库

时间:2013-05-22 04:59:16

标签: android gradle android-studio

我正在尝试开发一个简单的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的新手,如果我误解了某些内容,请向我道歉。

3 个答案:

答案 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)

要包含您需要的本机库:

  1. 创建包含“.so”文件的特殊结构的“jar”文件;
  2. 在依赖项列表中包含该文件。
  3. 要创建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”

那应该解决你的问题。