我的问题是针对 64 位 Android 系统的原生 Android 开发。
我正在寻找一种方法来使用 gradle 构建系统在 64 位 Android 系统上配置对 32 位编译 native 库的支持。应用程序应使用的库仅可用于 32 位版本。将这些库移植到 64 位将非常耗时且容易出错。
因此,我想配置 gradle 以部署这些预构建的 32 位二进制文件并使用 32 位版本的 Android 应用程序。
当前配置导致以下错误:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: <application_name>, PID: 2170
java.lang.UnsatisfiedLinkError:
dalvik.system.PathClassLoader
[DexPathList[[zip file "/data/app/<application_name>/base.apk"],
nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]]
enter code here`couldn't find "libmynativelibrary.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
似乎 PathClassLoader
查找了错误的目录。我检查了提供的 apk 文件,它缺少库。 apk 中没有 lib
文件夹。构建系统不包含 32 位库。
由于 armv7
只有一个预构建版本,因此这些库位于 app/src/main/jnilibs
文件夹中。
我必须补充一点,此设置适用于任何 32 位 Android 系统。我之前用模拟器和物理设备试过。
应该如何使用 gradle 激活多架构 32/64 位支持?或者如何使用 Android Studio/gradle 将 32 位应用程序部署到 64 位 Android 系统?
我在网上搜索并找到一个与该主题相关的链接,但它指的是较旧的构建系统:https://source.android.com/source/64-bit-builds.html .我不知道如何将描述采纳到 gradle。
我正在使用 Android Studio(构建:141.1989493,2015 年 6 月 6 日)。
project/build.gradle
保持不变。 app/build.gradle
文件如下所示:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "<application_name>"
minSdkVersion 1
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
debug {
debuggable true
}
}
productFlavors {
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
fat
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
最佳答案
mulilib 的概念仅适用于作为 Android 系统构建一部分的项目,您不应设置 android:multiarch 选项,因为您只有 32 位库,因为此选项仅适用于同时提供 32 位和 64 位的应用程序库到其他已安装的应用程序。
64位安卓系统直接支持32位应用。对于任何 Android 设备,您只需要正确打包您的应用,将您的 .so 文件放在 APK 的 lib/(armeabi-v7a,x86,...)
中。
在安装时,将安装设备首选架构的库。即:如果没有 x86_64 文件夹,将安装 x86 库/如果没有 arm64-v8a 文件夹,将安装 armeabi-v7a 库,您的应用程序将以 32 位模式运行。
如果您在 lib 下没有任何内容,则意味着 Android Studio 不知道您的 .so 文件。默认情况下,它会在 jniLibs/(armeabi-v7a,x86,...)
中查找它们,因此您应该将它们放在那里或更改 sourceSets.main.jniLibs.srcDir
到您选择的目录。
关于Android NDK -multlib 支持使用 gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761725/