在android studio的apk中包含.so库
我正在尝试开发一个简单的android应用程序,我正在尝试使用它,它在内部使用.so库。我已经阅读了有关的文档。我遵循了这些步骤,它编译时没有任何错误。但是,在运行时,它抛出在android studio的apk中包含.so库,android,gradle,android-studio,Android,Gradle,Android Studio,我正在尝试开发一个简单的android应用程序,我正在尝试使用它,它在内部使用.so库。我已经阅读了有关的文档。我遵循了这些步骤,它编译时没有任何错误。但是,在运行时,它抛出未满足的linkerror 通过谷歌搜索,我找到了它,但我找到了一个我正在尝试使用的黑客。但它在第40行抛出编译时错误,大意是 tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask -> pkgTask.jniDir
未满足的linkerror
通过谷歌搜索,我找到了它,但我找到了一个我正在尝试使用的黑客。但它在第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')
}
任何人都可以帮助我,我做错了什么,或者我应该做些什么来包括这些。那么,我的apk中的库呢
由于我是android开发和gradle的新手,如果我误解了什么,请向我道歉。我也有同样的问题。查看中的评论 它说: 对于gradle android插件v0.3,请使用“com.android.build.gradle.tasks.PackageApplication”
这应该可以解决您的问题。我已经尝试了公认答案中提供的解决方案,但它对我无效。 我想与大家分享我的工作成果,因为它可能会帮助其他人。我找到了这个解决办法 基本上,您需要做的是将
文件放入名为lib
的文件夹中(注意:它不是libs
,这不是错误)。它应该与APK文件中的结构相同
我的情况是:
项目:
|--lib:
|--|--armeabi:
|--|--|--.so文件。
所以我制作了一个lib文件夹,其中有一个armeabi文件夹,我在其中插入了所有需要的.So文件。然后,我将文件夹压缩到一个.zip
(zip文件中的结构现在是lib/armeabi/*.so)中,我将.zip
文件重命名为armeabi.jar
,并将编译文件树(dir:'libs',include:'*.jar')
添加到gradle构建文件中的依赖项{}
这以一种相当简洁的方式解决了我的问题。要包含您需要的本机库,请执行以下操作:
创建包含“.so”文件的特殊结构的“jar”文件李>
将该文件包括在依赖项列表中
要创建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”部分:
也适用于v0.4,尽管我必须修改copy命令的“from”以从项目目录而不是构建目录中获取so文件。我必须将项目(':MyProject').buildDir更改为项目(':MyProject').getProjectDir()以使其工作,使用Android studio 0.3.6和com.Android.tools.build:gradle:0.6.+从Android gradle 0.7.2开始,您可以将本机库放入src/main/jniLibs中,它们将被正确打包。示例:正确的答案是,我在Android Studio 1.0.1和gradle 2.2.1版上尝试过这个,但没有成功。有什么线索吗?最好的答案直到studio中的支持出现。当我将Android studio更新为0.3.2(在Mac上)时,问题出现了。这是一个奇怪的问题,这个解决方案非常有效。在这件(愚蠢的)事情上浪费了几个小时之后,我可以说先生,你应该得到一杯啤酒@Richard在按照描述进行设置后,您是否清理了项目?这对我也有效,但我在棉花糖上遇到了错误。i、 例如,“file not fount libtbb.so”请帮助我。Compile
task已被弃用。改为使用JavaCompile
。我使用这个答案而不是Assaf的答案,因为它使它成为一个自动化的过程。此外,有许多方法可以手动生成zip文件,其中一些方法会引入不必要的文件。这对我来说并不适用,因为在干净的构建(/gradlew clean
)中,在干净之后的第一个构建中(在APK中)不包括native-libs.jar。以后的构建(如果没有清理)可以正常工作。这对于我们的构建服务器脚本来说有点问题。有人能解决这个问题吗?我目前正在使用Gradle(wrapper)1.8和“com.android.tools.build:Gradle:0.6.3”。从android Gradle 0.7.2开始,您可以将本机库放在src/main/jniLibs中,它们将被正确打包。示例:将以下内容添加到build.gradle:sourceSets{main{jniLibs.srcDirs=['libs']}
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')