`

Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

 
阅读更多
  • 很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。

    一、没有将so打包到apk中的原因。

    当你发现到findlibrary returned null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86、armeabi、armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可。

    一般有两方面的原因:

     

    1.apk中有对应平台的文件夹,但是文件夹里却没有对应的so。

    举个例子,apk中lib下面一旦出现x86文件夹,程序运行的时候就会去加载x86对应的库,但是如果此时x86文件夹没有将so放进来,则会遇到报错。

    2.第三方对平台的兼容策略与自己不一致。

    可能第三方选择了只支持armeabi(假设某支付sdk),但是我们的游戏在Application.mk中配置了APP_ABI := all,如此,我们的游戏打包出 了所有平台的so,但是第三方却只有armeabi文件夹对应的so,造成程序运行异常,这种情况在开发期间最常见,一些小公司由于测试人员不足或者测试设备不足,上线后才发现这个问题也不奇怪。

    二、对于平台的支持,我们应该如何选择。

    armeabi-v7a确实是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi。 x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。具体会有怎样的性能损耗,作者还不能说的非常清楚,可以访问下intel官方在csdn的博客。 总结一下在项目中的表现就是: 
    如果项目只包含了 armeabi,那么在所有Android设备都可以运行; 如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
分享到:
评论

相关推荐

    Android armeabi-v7a arm64-v8a jpeg 库

    在Android开发中,armeabi-v7a和arm64-v8a是两种常见的CPU架构,它们对应于不同的处理器指令集,对于提供跨平台兼容性的应用或库来说至关重要。JPEG库,全称Joint Photographic Experts Group,是一种广泛使用的图像...

    gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz.7z

    可用于交叉编译32-bit Armv7 Cortex-A, hard-float, little-endian目标中的裸机程序、u-boot、Linux kernel、filesystem和App应用程序。gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf交叉编译器必须安装在64...

    opencv4 , 包含的arm64-v8a、armeabi-v7a、x86、x86_64的so库

    3. **armeabi-v7a**:armeabi-v7a是Android的32位ARM架构,广泛应用于中低端Android设备。OpenCV4的armeabi-v7a库确保了这些设备上的兼容性,虽然性能可能不如64位版本,但它覆盖了更广泛的用户群体。 4. **x86和...

    FFmpeg Android armeabi-v7a arm64-v8a 动态链接库.so文件.zip

    针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。

    FFmpeg Android armeabi-v7a arm64-v8a 动态链接库.so文件

    针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。

    android-arm64-v8a.zip

    5. **多架构支持**: Android为了兼容不同硬件架构,提供了多种ABI(Application Binary Interface)版本,包括armeabi、armeabi-v7a、arm64-v8a、x86和x86_64等。开发者通常会为每个目标架构打包相应的库,以确保...

    VLC for Android 3.1.5 armeabi-v7a版apk、aar及so

    在这个案例中,除了armeabi-v7a,还有arm64-v8a、x86和x86_64的.so文件未包含在压缩包中,可能是因为文件大小限制。arm64-v8a是64位ARM架构,x86和x86_64分别对应32位和64位的Intel/AMD兼容处理器。通常,开发者会将...

    ffmepg的安卓arm(armeabi-v7a)版本

    在Android平台上,由于其运行环境为ARM架构(armeabi-v7a),因此需要针对这一架构进行交叉编译,以生成适用于Android设备的动态库或静态库。 交叉编译是指在一个平台上生成另一个平台上的可执行代码的过程。在这个...

    ijkplayer-anddroid编译好的so库 arm64-v8a、armeabi、armeabi-v7a、x86、x86_64

    ijkplayer-anddroid编译好的arm64-v8a、armeabi、armeabi-v7a、x86、x86_64 下的so库,包括libijkffmpeg.so,libijkplayer.so,libijksdl.so

    armeabi-v7a.rar

    然而,值得注意的是,不同的Android设备可能有不同的CPU架构,因此,为了支持更多设备,你可能需要为其他架构(如armeabi、arm64-v8a、x86等)也编译对应的库。 在使用FFmpeg时,你需要了解其API接口,如avformat、...

    libsdl2.28.3_so_arm64-v8a_armeabi-v7a_x86_x64_full.rar

    标题中的"libsdl2.28.3_so_arm64-v8a_armeabi-v7a_x86_x64_full.rar"表明这是一个与SDL2相关的库文件,版本为2.28.3,适用于不同的处理器架构:arm64-v8a(64位ARM架构)、armeabi-v7a(32位ARM架构)、x86_64(64位...

    ijkplayer so库 包含(arm64-v8a、armeabi、armeabi-v7a、x86、x86_64)

    1. 集成ijkplayer时,需将so库放入项目的jniLibs目录下,并按照Android Studio的结构分别放入对应架构的子目录(如:jniLibs/armeabi、jniLibs/arm64-v8a等)。 2. 引入ijkplayer的依赖库到项目build.gradle文件中,...

    arm64-v8a.zip

    在Android平台上,为了实现跨平台的兼容性,通常会有多个版本的库文件,例如armeabi、armeabi-v7a、x86以及arm64-v8a等。arm64-v8a版本的libcurl专为64位的ARM架构设备优化,能够更好地利用硬件资源,提供更快的网络...

    arm64-v8a.rar

    注意,为了兼容其他架构,如armeabi-v7a、x86等,需要对每个架构分别编译并打包相应的库文件。 总结,本文详细介绍了如何在Android NDK环境中编译libcurl库,生成适用于arm64-v8a架构的库文件和头文件,并实现了...

    android-ndk-r9-windows-x86_64.zip

    NDK的主要目的是为Android应用提供一个平台,以利用C和C++库,尤其是在处理图形、物理模拟和高性能计算时,这些语言的优势尤为明显。R9作为老版本,发布于2014年,虽然较新版本有更多改进,但依然在某些特定场景下...

    android-ndk(android-ndk-r26b-windows.zip)

    3. **交叉编译**:NDK包含了一系列交叉编译工具链,能够将源代码编译为不同架构(如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64等)的二进制文件,以适应不同类型的Android设备。 4. **性能优化**:对于计算密集...

    opencv-opencl/arm64-v8a/armeabi-v7a/x86-64/x86

    在Android平台上,OpenCV支持多种架构,包括arm64-v8a、armeabi-v7a、x86_64和x86。这些不同的架构对应着Android设备的不同处理器类型。 1. **arm64-v8a**: 这是适用于64位ARM处理器的优化版本,如高通Snapdragon ...

    curl-anroid23-x86-x86_64-v7a-v8a_V7_85_0 (最新版 支持https)

    当前最新版 curl 是 7.85.0 包含了openssl 3.0.5 zlib 1.2.12 APP_PLATFORM android-23 包含 armeabi-v7a arm64-v8a x86 x86_64 动态库(so) 与静态库(a) 及头文件 用 android-ndk-r21e 编译

    android ndk,双libs打包实例

    本实例将探讨如何在Android项目中打包包含两个不同架构(armeabi-v7a和x86)的原生库(lib)。 Android设备有多种处理器架构,如armeabi-v7a(ARMv7架构)和x86(Intel架构)。为了确保应用能在各种设备上运行,...

Global site tag (gtag.js) - Google Analytics