android - 在 android studio 的 apk 中包含 .so 库

标签 android gradle android-studio

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

四处搜索,我发现,gradle doesn't support .so libraries yet ,但我发现了一个 hack here我正在尝试使用。但它会在要点的第 40 行抛出编译时错误,即,

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

Could not find property 'com' on Project 'MyProject'

我在这里发布我的 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 的新手,如果我误解了什么,请向我道歉。

最佳答案

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

基本上你需要做的是将你的 .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 的构建中的 dependencies {}文件。

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

关于android - 在 android studio 的 apk 中包含 .so 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683775/

相关文章:

java - Android:插入数组时出现空指针异常

android - 如何检查设备是否支持 SMS?

java - Spring boot Gradle 从构建的 jar 中创建一个 tar 文件(不包括资源)

android - 升级到最新的Android Gradle Plugin AndoidX后Gradle报错

java - Android BroadcastReceiver 未收到 BOOT_COMPLETED 事件

android - 不要让 Activity 选项不起作用

android - 获取深度子测量事件的根维度

android - 从第三方 lib/sdk 中删除所有调试日志记录调用(Proguard 不工作)

gradle - 如何配置 Gradle google-java-format 插件以在构建步骤中运行 goJF?

android - 使用 ImageButton android 分享到 Whatsapp