在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 gradle 仍然在我的 apk 中包含用于 google play services 分析的库?