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

我想包括mupdf作为一个预编译的.so二进制文件到我的项目的Android库模块。

我有一个应用程序模块,其中包括我的库模块。

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 

我的mupdf库项目的build.gradle:

 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文件中删除了产品风味部分,它会编译。 但它在运行时崩溃,因为它无法解析/加载libmupdf库。

你可以做到这一点,没有产品口味。 只要将它们删除并在启动时调用System.loadLibrary("mupdf") /在使用库之前的某个时刻。 这个调用会找出当前的设备体系结构使用哪个本地库。

事实上,我必须为.aar库构建一个胖模块,并在我的app.gradle中应用产品特征。 我在图书馆的build.gradle中错过了这个

 sourceSets.main { jni.srcDirs = [] // This prevents the auto generation of Android.mk jniLibs.srcDir 'src/main/jni' } 

没有这个方法就没有办法解决。