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

Rum*_*iya 138 android gradle android-studio

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

谷歌搜索它,我发现,gradle不支持.so库,但我在这里发现了一个我正在尝试使用的黑客.但它会在gist的第40行抛出编译时错误,

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

无法在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')
}
Run Code Online (Sandbox Code Playgroud)

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

由于我是Android开发和gradle的新手,如果我误解了某些内容,请向我道歉.

Ass*_*iel 256

我已经尝试了在接受的答案中提出的解决方案,但它对我不起作用.我想分享一下DID对我有用,因为它可能会帮助别人.我在这里找到了这个解决方案.

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

在我的情况下它是:
项目:
| --lib:
| - | --armeabi:
| - | - | - .so files.

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

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

  • 在这个(愚蠢的)事情上浪费了几个小时之后,我可以说你先生了一个啤酒! (12认同)
  • @Richard按照描述设置后,你清理了项目吗? (3认同)
  • 这对我也有用,但我收到棉花糖的错误.即,"文件不fount libtbb.so"请帮助我. (2认同)

Rus*_*hyn 67

要包含您需要的本机库:

  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)
}
Run Code Online (Sandbox Code Playgroud)

要包含结果文件,请将以下行粘贴到"build.gradle"文件的"dependencies"部分:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
Run Code Online (Sandbox Code Playgroud)

  • 从Android Gradle 0.7.2开始,您可以将您的本机库放在src/main/jniLibs中,它们将被正确打包.示例:https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main/jniLibs (37认同)
  • `Compile`任务已被弃用.请改用"JavaCompile". (29认同)
  • 将以下内容添加到build.gradle:sourceSets {main {jniLibs.srcDirs = ['libs']}} (7认同)
  • 这对我来说并不适用,因为在干净的构建(`./gradlew clean`)上,native-libs.jar不包含在clean之后的第一个构建中(在APK内).后期构建(如果没有清理)工作正常.这对我们的构建服务器脚本来说有些问题.有人有任何解决方案吗?我目前正在使用Gradle(包装器)1.8和"com.android.tools.build:gradle:0.6.3". (3认同)
  • 我使用这个答案而不是Assaf的答案,因为它使它成为一个自动化过程.此外,有许多方法可以手动创建zip文件,其中一些方法会引入不必要的文件. (2认同)

Pag*_*ian 27

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

它说:

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

这应该可以解决你的问题.

  • 从Android Gradle 0.7.2开始,您可以将您的本机库放在src/main/jniLibs中,它们将被正确打包.示例:https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main/jniLibs (25认同)
  • 我尝试使用Android Studio 1.0.1和gradle版本2.2.1,但它没有用.有线索吗? (2认同)