如何在64位安卓系统中使用32位SO库

gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu交叉编译Arm Linux环境下的身份证读卡器so库操作步骤 1、配置环境变量①将gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar解压至/home/eastcoms/sudo或者root运行命令 :sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /home/eastcoms.tar用 -xvf.gz用 -zxvf.bz2用 -jxvf.xz用 -Jxvf②修改环境变量 命令:sudo gedit /etc/profi 阅读详情

背景知识:

对于64位系统的编译规则,可参考:http://source.android.com/source/64-bit-builds.html


关键点:

  • JAVA编译不分32bit和64bit(APK,JAR)
  • 可执行文件,默认编译64位
  • 动态库和静态库,默认同时编译32bit和64bit版本
  • 通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译
  • JAVA加载JNI库(so文件)的规则:
    如果APP需要加载的所有so都是32bit,则使用32bit方式加载so库;如果APP需要加载的so库中只要有一个so是64bit的,则必须以64bit方式加载so库;不能同时加载32bit和64bit的so库。

实际工程中,我们通常会遇到下面这样的场景:
A. APK有源码,SO库有源码 - 应用及so库我们都能自己编译出来
B. APK有源码,SO库没有源码 - 我们开发的应用使用了第三方的so库,如ScanService
C. APK和SO库都没有源码 - 预置第三方的应用(应用中包括so库)

对于场景A:

只要我们编译默认对应的APP和SO库(32bit+64bit)即可。
此种场景最为普通,本文不做详细讲解。

对于场景B:

如果APK需要加载的库里面有64bit的,则需要全部的库都使用64bit。
如果APK调用的第三方so库中有32bit的,则:要么让第三方提供64bit版本的so库,要么强制使所以的so库都使用32bit版本。

对于场景C:

使用特定的预置规则即可。


场景A范例:

  • APK的编译规则不需要设置LOCAL_MULTILIB
  • SO库的编译规则也不需要设置LOCAL_MULTILIB
    所以,SO库就会同时编译出32bit和64bit版本,APK按照64bit方式调用so库

场景B范例:

  • APK的编译规则需要设置LOCAL_MULTILIB
  • SO库的编译规则需要指定64bit或32bit(本地编译或预置的都需要)
  • 需要显示声明APK的JNI库
    如:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := odm conscrypt sp
LOCAL_PACKAGE_NAME := PosService

# to support on 64-bit system
LOCAL_JNI_SHARED_LIBRARIES := \
                          libmiscjni \
                          libttyjni \
                          libIAL \
                          libSDL \
                          libbarcodereader \
                          libHsmKil \
                          libHHPScanInterface \
                          libHSMDecoderAPI
LOCAL_MULTILIB := 32

include $(BUILD_PACKAGE)

其中某个本地编译so的规则:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
    com_odm_tty.cpp
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libttyjni
LOCAL_MULTILIB := 32
include $(BUILD_SHARED_LIBRARY)

某个第三方so的规则:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE := libHHPScanInterface
LOCAL_SRC_FILES := $(LOCAL_MODULE).so
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
LOCAL_MULTILIB := 32
include $(BUILD_PREBUILT)

场景C范例:

  • APK使用典型的预置应用规则
  • SO库不需要写预置规则
  • 需要显示声明APK调用的SO库
    如:
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := BaiduIME
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := baidu_input_for_xiaomiV5.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MULTILIB := 32
LOCAL_PREBUILT_JNI_LIBS := \
    @lib/armeabi/libBDVoiceRecognitionClient_V1.so \
    @lib/armeabi/libchiperencoder_v1_2_1.so \
    @lib/armeabi/librabjni-1.so \
    @lib/armeabi/libshare_v2.so
include $(BUILD_PREBUILT)

粗体部分是需要特别注意的地方。

安卓CPU架构全解析:arm64-v8a、armeabi-v7a、x86及x86_64的兼容性与实战选型指南 本文全面解析安卓CPU架构arm64-v8a、armeabi-v7a、x86及x86_64的区别与兼容性,提供实战选型指南。针对arm64-v8a这一主流架构,详细分析其性能优势及兼容策略,帮助开发者优化应用性能并避免常见崩溃问题,涵盖架构检测工具与APK体积优化方法。 阅读详情

相关推荐

插件化框架解读之so-文件加载机制(四)

整篇梳理下来,虽然梳理 so 的加载流程不难,但要掌握知其所以然的程度,就需要多花费一点心思了。毕竟都涉及到应用的安装机制,应用启动流程,系统启动机制,Zygote 相关的知识点了。如果你是开发系统应用的,建议还是花时间整篇看一下,毕竟系统应用的集成不像三方应用那样在 apk 安装期间自动将相关 so 文件解压到 nativeLibraryDirectories 路径下了。三方应用很少需要了解 so 的加载流程,但开发系统应用还是清楚点比较好。

2401_84123077的博客 1193

Android的Multilib Build

在应用的Android.mk中,有一个全局变量:LOCAL_MULTILIB := 32 它的值可以是32,64,both,表示可以编译的apk可以运行在32位、64位,或者32&64位硬件平台, 因为支持multilib build,所以zygote的启动脚本.rc也有多个版本: init.zygote32.rc init.zygote32_64.rc //支持32,64位系统,...

longtian635241的专栏 1586

安卓系统移植不求人:手把手教你识别和替换关键so文件(附常见功能对照表)

本文详细介绍了安卓系统移植过程中如何精准识别和替换关键so文件,解决相机、蓝牙、音频等常见功能异常问题。通过功能-so文件对照表和六步替换法则,帮助开发者避免系统崩溃风险,提升移植效率。特别适用于ROM和GSI固件开发者,包含2023年最新so文件参考和高级调试技巧。

weixin_30239339的博客 553

Android编译32或64位程序

reserved-2020-1127–4

baron-周贺贺-代码改变世界ctw 4236

Android 浅度解析:mk预置AAR、SO文件、APP包和签名

本文介绍在Android系统开发中Android.mk,预置APK和AAR/SO文件,以及指定签名的操作。

我其实什么都不会 8498

Android系统预装带so的apk

需求是预装带so的apk当作系统app,自己的app成了预装软件,是不是想起当年新买的手机被厂商支配的那段日子,如今转变下身份,预装自己的app到手机当中 ,还不能卸载!心中不免有些暗爽。

Android小码家 2250

java 64位安卓加载32位so,如何在64位安卓系统中使用32位SO库

背景知识:关键点:JAVA编译不分32bit和64bit(APK,JAR)可执行文件,默认编译64位动态库和静态库,默认同时编译32bit和64bit版本通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译JAVA加载JNI库(so文件)的规则:如果APP需要加载的所有so都是32bit,则使用32bit方式加载so库;如果APP需要加载的so库中只要有一个so是64...

weixin_30913041的博客 862

ADG同步性能优化:如何正确配置standby redolog避免WAIT_FOR_LOG状态

本文深入剖析了Oracle ADG(Active Data Guard)同步中常见的WAIT_FOR_LOG状态,指出其根源在于Standby Redo Log(SRL)配置不当。文章提供了从诊断到优化的完整实践指南,重点阐述了SRL大小匹配、组数充足等黄金配置法则,帮助架构师从根本上避免同步延迟,实现稳定高效的实时数据同步。

weixin_29200485的博客 333

android64位机子兼容32位 so库文件,怎样在64位安卓系统中使用32位SO库

满意答案t5858582017.01.25采纳率:46%等级:6已帮助:307人关键点:JAVA编译不分32bit和64bit(APK,JAR)可执行文件,默认编译64位动态库和静态库,默认同时编译32bit和64bit版本通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译JAVA加载JNI库(so文件)的规则:如果APP需要加载的所有so都是32bit,则...

weixin_35860804的博客 2742

3D Slicer中Auto3DSeg和TotalSegmentator等自动分割插件总是安装失败,怎么办?教你两招

TotalSegmentator, MONAI auto3Dseg,这些工具因分割器官多,准确性高,备受关注。同时,这些自动分割工具被集成在了3D slicer平台,非常方便临床医生做手术规划。详细了解这些工具看之前的教程👇-------- 简单概述 --------其中,MONAIAuto3DSeg扩展附带数十种针对特定临床用例的预训练分割模型,这些模型旨在快速运行,几分钟内即可在任何普通计算机上运行,无需 GPU,甚至在笔记本电脑上。

zzjlhlcd的博客 1696

关于自制的《航空学报》latex模板(非官网模板)

《航空学报》的官网只提供了word模板,并且该期刊投稿只需要pdf版本不需要源文件。为方便latex爱好者撰写论文,提供该模板及说明给广大科研人士~

qq_37105055的博客 4688

怎样在64位安卓系统中使用32位SO库

背景知识: 对于64位系统的编译规则,可参考:http://source.android.com/source/64-bit-builds.html 关键点:JAVA编译不分32bit和64bit(APK,JAR)可执行文件,默认编译64位动态库和静态库,默认同时编译32bit和64bit版本通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译JAVA加载JNI库

jsn_ze的专栏 3885

永磁同步电机功率计算实战:从公式到避坑指南(附Excel计算模板)

本文详细解析永磁同步电机(PMSM)功率计算的实战技巧,涵盖三维参数体系、三相与单相系统差异、动态工况补偿及常见计算陷阱。特别提供Excel计算模板,帮助工程师快速准确完成功率计算,避免工业应用中的常见错误,提升工作效率。

x8y9z0的博客 801

怎样在64位安卓系统中使用32位SO库 2

之前跟的项目, 那些号称64位 CPU的主控, 跑的软件全是 32位的; 我仍然很清楚的记得, 当年 CEO 在给大家讲解财报,描述技术蓝图的时候, 宣称 64bit 软件的运行效率其实远不如预期, 因为所有的代码要备两份存储, 代码可能要两次加载过程, cache 利用率不高,软件修改量却很大...    好吧, 以这位 CEO 后来所表现出来的 RP, 他的话应该是一个字也不能信的, 我们所知

jsn_ze的专栏 3354

Laravel 结合 jwt-auth 实现无状态 API 认证(实战解析)

本文详细解析了如何在Laravel框架中结合jwt-auth实现无状态API认证,包括JWT的优势、环境搭建、Token签发与刷新、API路由保护等实战内容。通过具体代码示例和优化技巧,帮助开发者高效解决跨域认证问题,提升系统安全性。

weixin_29315569的博客 209

手把手教你:在openEuler 22.03上离线搞定OpenSSH 9.8升级(CentOS 7.9通用)

本文详细介绍了在openEuler 22.03和CentOS 7.9系统上离线升级OpenSSH 9.8的完整流程,包括准备工作、离线包获取、安装步骤、服务管理及回滚方案。特别针对无外网环境的企业服务器,提供安全可靠的离线升级解决方案,帮助运维人员有效提升系统安全性。

weixin_30682415的博客 192

解读apk分包-32位安装包、32位64位兼容包和64位安装包

确保应用包含64位库即可,如包含不做修改,如未包含,需添加64位库即可。 应用不一定要支持所有 64 位架构,但对于支持的每种原生 32 位架构,应用都必须包含相应的 64 位架构。

璐璐的专栏 3万+

【实战】YOLOv5/v8模型→RK3588 NPU高效部署:模型转换/量化/精度调优完整指南​

摘要: 本教程详细介绍了YOLOv5模型在RK3588 NPU上的优化部署流程,重点解析了架构转换与量化技术。通过将检测头输出结构与decode操作分离,显著提升了模型在NPU上的兼容性和计算效率。LetterBox预处理方案有效保持图像宽高比,相比直接resize提升检测精度。INT8量化技术采用非对称量化策略,通过scale和zero_point参数实现浮点到整数的转换,在保证精度的同时大幅提升推理速度。实验表明,优化后的模型在RK3588上实现了高效的实时目标检测性能,为边缘AI部署提供了完整解决方案

LXY_LOVE36的博客 624

Android之64位和32位区分

image.png .. ABI 是什么 在Android编码时候 ,我们经常会看到ABI 。ABI的意思是 Application Binary Interface 的缩写。 不同 Android 手机使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为...

u012739527的博客 5935

ACS运动控制器编程语言

ACS运动控制器采用SPiiPlusLanguage(SPL)作为核心编程语言,该语言基于C语法设计,内置丰富的运动控制指令,支持点位运动、插补等复杂控制。控制器提供专用开发工具SPiiPlusManager和ACSStudio,支持图形化编程与调试。同时兼容TCP/IP、EtherCAT等多种扩展接口,便于与上位机或PLC集成。使用时需注意实时性优先级、轴参数匹配等关键事项。官方文档和示例程序为开发者提供了完善的学习资源。

StevenChen的博客 612

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android 如何判断CPU是32位还是64位

可以利用Android 的系统 property (android.os.SystemProperties) 来判断CPU是32位还是64位: public static String getSystemProperty(String key, String defaultValue) { String value = defaultValue; tr

我的专栏 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

aosp11预置so库到系统

aosp定制开发中,有时为了达到系统瘦身效果,通过提取多app中共用的so库预置到系统中也是一个不错的方法。安卓系统中有两个放置so库的分区,一个是vendor分区,一个是system分区。两个分区的so库不可随意相互访问,vendor中的so只可访问system中稳定的so库,其他的不可访问,要实现相互访问的so可以通过vndk实现。为了减少文章内容篇幅,下文只演示预置so库到system分区,预置到vendor分区也是同样的方式,区别就是so库的位置不一样。

我的博客 893

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用了realm 后包变大了的解决方法, 和64位库问题。

官方提供的办法: 大部分情况下,在您 release 版本的 apk 文件里,Realm 只占用 800KB 空间。我们发布的版本支持的处理器架构包括 ARM7、ARMv7、ARM64、x86、MIPS。所以发布的库文件本身看起来会稍微大一些。但安卓系统在安装 apk 时只会安装针对该设备处理器架构的原生库,安装后占用空间会比 apk 文件本身还要小一些。 你可以通过将 APK 针

super黑兔的博客 5435

android so 兼容问题,关于安卓so的兼容性的简单说明

armeabi、armeabi-v7a、mips、x86 、arm64-v8a如何理解?ABI:指应用基于哪种指令集来进行编译,ABI以前总共有四种,分别是armeabi、armeabi-v7a、mips、x86,它们都是表示cpu的类型,现在又有了arm64-v8a。(注意:以下所有讨论不包括mips)先说以前对于so的平台兼容处理方式吧。以前安卓都是32位系统,运行的进程都是32位,理论上ar...

weixin_39732491的博客 445

Unity升级2017支持Google Android64位

为了推动安卓系统运行效率更高的64位,谷歌商店要求开发者2019年8月开始新应用必须提交64位的版本,而已经上架的Unity 5.6或更早版本引擎制作的游戏除外,他们可以只提供32位版本直到2021年8月,到时间点后需提供应用的64位版本。本身项目也在走海外市场,现在项目用的Unity版本是5.6的,所以最近把项目Untiy版本升级,把一些遇到的问题在这里记录下供参考。 首先先了解什么是安卓6...

qq_27831161的博客 2271
上一篇: Ubuntu下的Notepad++
下一篇: 重装Ubuntu13.04后需要做的事情
CedarDiao
博客等级 码龄19年 100粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值