【问题标题】:Include .so library in apk in android studio [duplicate]在android studio的apk中包含.so库[重复]
【发布时间】:2013-05-17 00:47:40
【问题描述】:

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

四处搜索,我发现gradle doesn't support .so libraries yet,但我发现了一个我正在尝试使用的黑客here。但它会在要点的第 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的新手,如果我误解了什么,请向我道歉。

【问题讨论】:

    标签: android gradle android-studio


    【解决方案1】:

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

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

    在我的情况下是:
    项目:
    |--lib:
    |--|--armeabi:
    |--|--|--.so 文件。

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

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

    【讨论】:

    • 最好的答案,直到工作室的支持在那里
    • 当我将 Android Studio 更新到 0.3.2(在 Mac 上)时,出现了问题。这是一个奇怪的问题,这个解决方案完美无缺。
    • 在这件(愚蠢的)事情上浪费了几个小时之后,我可以说您先生该喝啤酒了!
    • @Richard 您在按照描述设置项目后清理了项目吗?
    • 这对我也有用,但我在棉花糖上遇到错误。即“文件未找到 libtbb.so”请帮助我。
    【解决方案2】:

    要包含您需要的本机库:

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

    要创建 jar 文件,请使用以下 sn -p:

    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”文件的“依赖项”部分:

    compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
    

    【讨论】:

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

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

    上面写着:

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

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

    【讨论】:

    • 也可以在 v0.4 中使用,尽管我必须修改复制命令的“from”以从项目目录而不是构建目录中获取 so 文件。
    • 我必须使用 Android Studio 0.3.6 和 com.android 将 project(':MyProject').buildDir 更改为 project(':MyProject').getProjectDir() 才能使其正常工作。 tools.build:gradle:0.6.+
    • 从 Android Gradle 0.7.2 开始,您可以将原生库放在 src/main/jniLibs 中,它们会被正确打包。示例:github.com/commonsguy/sqlcipher-gradle/tree/master/src/main/…
    • 我在 Android Studio 1.0.1 和 gradle 版本 2.2.1 上尝试过,但没有成功。有什么线索吗?
    猜你喜欢
    • 2023-03-17
    • 2016-08-02
    • 2016-09-04
    • 2015-11-14
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多