在android中包含.so库Android工作室

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

谷歌search,我发现, Gradle不支持.so图书馆 ,但我发现这里我试图使用一个黑客。 但是它会在编号为40的行上抛出编译时错误,

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

在“项目”“我的项目”上找不到属性“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中包含这些.so库?

由于我是Android开发和Gradle新手,如果我误解了一些东西,请道歉。

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

它说:

for gradle android plugin v0.3使用“com.android.build.gradle.tasks.PackageApplication”

这应该解决你的问题。

我已经尝试了在接受的答案中提出的解决scheme,并没有为我工作。 我想分享DID为我工作,因为它可能会帮助别人。 我在这里find了这个解决scheme。

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

在我的情况是这样的:
项目:
| –lib:
| – | –armeabi:
| – | – | – so文件。

所以我做了一个lib文件夹,里面有一个armeabi文件夹,里面插入了所有需要的.so文件。 然后我把这个文件夹压缩成一个.zip (zip文件里面的结构现在是lib / armeabi / *。so),我把.zip文件改名为armeabi.jar并添加了行compile fileTree(dir: 'libs', include: '*.jar')转换为gradle的构build文件中的dependencies {}

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

要包含本地库,您需要:

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

要创buildjar文件,请使用以下代码片段:

 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')