怎样在64位安卓系统中使用32位SO库
来源:互联网 发布:dd3000软件 编辑:程序博客网 时间:2024/06/06 23:41
背景知识:
如果APP需要加载的所有so都是32bit,则使用32bit方式加载so库;如果APP需要加载的so库中只要有一个so是64bit的,则必须以64bit方式加载so库;不能同时加载32bit和64bit的so库。
所以,SO库就会同时编译出32bit和64bit版本,APK按照64bit方式调用so库场景B范例:APK的编译规则需要设置LOCAL_MULTILIBSO库的编译规则需要指定64bit或32bit(本地编译或预置的都需要)需要显示声明APK的JNI库
如:
如:
对于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库)
只要我们编译默认对应的APP和SO库(32bit+64bit)即可。
此种场景最为普通,本文不做详细讲解。
如果APK需要加载的库里面有64bit的,则需要全部的库都使用64bit。
如果APK调用的第三方so库中有32bit的,则:要么让第三方提供64bit版本的so库,要么强制使所以的so库都使用32bit版本。
使用特定的预置规则即可。
场景A范例:APK的编译规则不需要设置LOCAL_MULTILIBSO库的编译规则也不需要设置LOCAL_MULTILIB所以,SO库就会同时编译出32bit和64bit版本,APK按照64bit方式调用so库场景B范例:APK的编译规则需要设置LOCAL_MULTILIBSO库的编译规则需要指定64bit或32bit(本地编译或预置的都需要)需要显示声明APK的JNI库
如:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platformLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_JAVA_LIBRARIES := odm conscrypt spLOCAL_PACKAGE_NAME := PosService# to support on 64-bit systemLOCAL_JNI_SHARED_LIBRARIES := \ libmiscjni \ libttyjni \ libIAL \ libSDL \ libbarcodereader \ libHsmKil \ libHHPScanInterface \ libHSMDecoderAPILOCAL_MULTILIB := 32include $(BUILD_PACKAGE)
其中某个本地编译so的规则:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := \ com_odm_tty.cppLOCAL_C_INCLUDES := $(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES := \ libcutils \ libutilsLOCAL_PRELINK_MODULE := falseLOCAL_MODULE_TAGS := optionalLOCAL_MODULE := libttyjniLOCAL_MULTILIB := 32include $(BUILD_SHARED_LIBRARY)
某个第三方so的规则:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_MODULE_SUFFIX := .soLOCAL_MODULE := libHHPScanInterfaceLOCAL_SRC_FILES := $(LOCAL_MODULE).soLOCAL_MODULE_PATH := $(TARGET_OUT)/libLOCAL_MULTILIB := 32include $(BUILD_PREBUILT)
场景C范例:APK使用典型的预置应用规则SO库不需要写预置规则需要显示声明APK调用的SO库 如:
LOCAL_PATH := $(my-dir)include $(CLEAR_VARS)LOCAL_MODULE := BaiduIMELOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := baidu_input_for_xiaomiV5.apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE := PRESIGNEDLOCAL_MULTILIB := 32LOCAL_PREBUILT_JNI_LIBS := \ @lib/armeabi/libBDVoiceRecognitionClient_V1.so \ @lib/armeabi/libchiperencoder_v1_2_1.so \ @lib/armeabi/librabjni-1.so \ @lib/armeabi/libshare_v2.soinclude $(BUILD_PREBUILT)
阅读全文
0 0
- 怎样在64位安卓系统中使用32位SO库
- 怎样在64位安卓系统中使用32位SO库 2
- 如何在64位安卓系统中使用32位SO库
- 怎样在64位的Ubuntu中使用32位的系统库或是支持的功能
- 在32位系统中使用64位虚拟机
- 使用virtalBox在32位系统上的虚拟机中安装64位系统
- android 64位系统,调用32位so文件
- 在64位系统中运行32位命令提示符
- 在64位系统中添加32位支持
- 强制app使用32位.so库
- .so文件-64位/32位使用问题
- [CentOS]64位系统中安装了32位程序软件:/lib/ld-linux.so.2: bad ELF interpreter解决
- 在64位的系统中安装32位的库
- 在windowsXP系统中使用Eclipse开发Android动态库so(一):第一个测试so
- 在windowsXP系统中使用Eclipse开发Android动态库so(二):简单图像处理so
- 在64系统中如何使用32位驱动的应用
- 使用realm的时候在so文件冲突,读取不到32位so文件解决
- 怎样在cocos2Dx项目里加so库
- 【Redis】redis数据结构简介
- 基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例
- Intellij IDEA 打包jar的多种方式
- 输出匹配项:grep
- task_struct(进程描述符)
- 怎样在64位安卓系统中使用32位SO库
- ISOMAP(等规度映射方法)
- antlr.collections.AST.getLine()I异常
- head、tail 命令和实时(real-time)更新
- malloc和free
- python3学习--3列表与元组
- Codeforces Round #416 C. Vladik and Memorable Trip (DP)题解
- 【Redis】redis实例
- python函数的作用域和名称空间