如何使用 productflavors 和 jni 设置 Android 库模块

How to setup Android library module with productflavors and jni

我正在尝试将 mupdf 作为 android 库模块包含在我的项目中,并带有预编译的 .so 二进制文件。

我有一个包含我的库模块的应用程序模块。

dependencies {
   compile project(':mupdf')
}

在我的 mupdf 库模块中,我有这样编译的二进制文件。

mupdf
- jniLibs
  - arm64-v8a
    libmupdf.so
  - armeabi
    libmupdf.so
  - armeabi-v7a
    libmupdf.so
  - x86
    libmupdf.so
  - x86_64
    libmupdf.so

我的 build.gradle 的 mupdf 库项目:

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    publishNonDefault true
    productFlavors {
        x86 {
            ndk {
                abiFilter "x86"
            }
        }
        x64 {
            ndk {
                abiFilter "x86_64"
            }
        }
        arm {
            ndk {
                abiFilter "armeabi"
            }
        }
        arm_v7a {
            ndk {
                abiFilter "armeabi-v7a"
            }
        }
        arm64_v8a {
            ndk {
                abiFilter "arm64-v8a"
            }
        }
        fat
    }
}
dependencies{
    compile project(':core')
}

问题是在我添加产品风格后我的应用程序无法编译,因为它没有从 mupdf 模块中找到任何 java 文件。 如果我从它编译的 gradle 文件中删除产品口味部分。但是它在运行时崩溃,因为它不能 resolve/load libmupdf 库。

您可以在没有产品口味的情况下执行此操作。只需删除它们并在使用库之前的某个时间点在 startup/at 上调用 System.loadLibrary("mupdf")。此调用将找出用于当前设备架构的本机库。

事实上,我必须为 .aar 库构建一个胖模块并在我的 app.gradle 中应用 productflavors。 我在图书馆的 build.gradle

中遗漏了这个
sourceSets.main {
    jni.srcDirs = [] // This prevents the auto generation of Android.mk
    jniLibs.srcDir 'src/main/jni'
}

没有这个,任何方法都无法解决。