在android studio的apk中包含.so库[重复]

Posted

技术标签:

【中文标题】在android studio的apk中包含.so库[重复]【英文标题】:Include .so library in apk in android studio [duplicate] 【发布时间】: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的新手,如果我误解了什么,请向我道歉。

【问题讨论】:

【参考方案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】:

要包含您需要的本机库:

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

要创建 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/… 正确答案是***.com/questions/16667903/… 我在 Android Studio 1.0.1 和 gradle 版本 2.2.1 上尝试过,但没有成功。有什么线索吗?

以上是关于在android studio的apk中包含.so库[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中包含 *.so 库?

如何在Android Studio中包含* .so库?

关于android studio so文件 冲突 怎么解决

当我设置为仅编译播放服务广告时,为啥 Android Studio gradle 仍然在我的 apk 中包含用于 google play services 分析的库?

Android Studio 编译apk,so库一起打包

Android Studio如何把so库编译进apk中