如何使用 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'
}
没有这个,任何方法都无法解决。
我正在尝试将 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'
}
没有这个,任何方法都无法解决。