原文网址:http://blog.csdn.net/andrewblog/article/details/43601303

最近公司的一个项目使用android 5.0 64 bit平台,相对以前版本,除了android 5.0 有很大变动之外,64 bit系统和32 bit系统也存在很多差异性。

目前碰到的问题就是以前在32位上的so库文件,到64 位系统上不能加载的问题。首先来看一下相关log信息

logcat信息:

01-01 08:00:09.322 D/SensorService( 1606): nuSensorService starting...
01-01 08:00:09.323 E/HAL  ( 1606): load: module=/system/lib64/hw/sensors.default.so
01-01 08:00:09.323 E/HAL  ( 1606): dlopen failed: "/system/lib64/hw/sensors.default.so" is 32-bit instead of 64-bit
01-01 08:00:09.323 E/SensorService( 1606): couldn't load sensors module (Invalid argument)

ps信息:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME

root      1172  1     1254940 56612 ffffffff 8e579300 S zygote64
root      1173  1     940684 49112 ffffffff f75da8a8 S zygote
shell     1174  1     4136   956   000b45f4 9bcef2e8 S /system/bin/sh

system    1606  1172  1411680 87808 ffffffff 8e579b88 S system_server
u0_a11    1730  1172  1298048 43684 ffffffff 8e579b88 S com.android.systemui
root      1742  1174  4136   976   000b45f4 8d71b2e8 S sh

从上面的log信息我们可以得出如下信息:

1. 64 bit 系统启动后,会运行两个进程zygote64 ,zygote ,对应的进程号为1172 和1173

2.sysrem_server进程由zygote64 启动,它的进程号为1606

3.logcat 信息里面提示的错误信息,是在sysrem_server进程调用的,也就是说sensors.default.so库是在进程sysrem_server中去加载的。

综合上面信息,不难发现,sysrem_server是由zygote64启动的,所以加载的so库也必须是64bit类型。否则就会报如下错误

dlopen failed: "/system/lib64/hw/sensors.default.so" is 32-bit instead of 64-bit

为了解决这个问题,就必须把原来so文件的源码,放到64 bit的编译环境下编译。

首先,我直接复制源码到64 bit的android源码下编译,没有做任何修改,编译信息如下,

build/core/shared_library.mk:12: sensors.default: LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead
Import includes file: out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target thumb C: sensors.default_32 <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default_32 (out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
Import includes file: out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target  C: sensors.default <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default (out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default (out/target/product/coconut/symbols/system/lib64/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default (out/target/product/coconut/obj/lib/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default_32 (out/target/product/coconut/obj_arm/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib64/hw/sensors.default.so

在/system/lib64/hw/目录下面生成了库文件sensors.default.so,然后我把该库文件替换到终端里面,既然发现还是会出现和上面一样的错误,找不到so库。

在网上查了一下资料,很少相关介绍,这个时候感觉没思路了,找不到问题突破点。

后来再编译操作了一遍,发现了一条很重要的信息提示,

build/core/shared_library.mk:12: sensors.default: LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead

这个信息提示已经说得很明白,然后我查看了一下android.mk文件,果断的把LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw语句改成了

LOCAL_MODULE_RELATIVE_PATH := hw,然后再重新编译。log如下

Import includes file: out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target  C: sensors.default <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default (out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default (out/target/product/coconut/symbols/system/lib64/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default (out/target/product/coconut/obj/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib64/hw/sensors.default.so
Import includes file: out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target thumb C: sensors.default_32 <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default_32 (out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default_32 (out/target/product/coconut/symbols/system/lib/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default_32 (out/target/product/coconut/obj_arm/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib/hw/sensors.default.so

注意看这次的log信息,没有上面的提示信息,并且还有一个关键的不同点,就是在system/lib64/hw 和system/lib/hw两个目录下都生成了sensors.default.so库文件

赶紧把system/lib64/hw/目录下的sensors.default.so替换到终端的system/lib64/hw/目录,重启验证,发现库文件可以正常运行。

小结一下:

1. 初次在64bit系统上开发,相对在32bit上,会发现出现很多意想不到问题,以前很多直接移植的东西可能在64bit上就不能使用。

针对这类问题,解决问题的核心思想一定要放在分析64bit 和32bit的差异性,包括编译、数据处理方式、数据类型等方面。

2.针对64bit系统平台的一些运行机制,还存在很多疑问,这个还得在实践中慢慢去摸索了。

【转】android 5.0 64bit系统加载库文件失败问题浅析的更多相关文章

  1. Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...

  2. Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案

    此文章仅作为本人的笔记,文章转载自  http://blog.csdn.net/defonds/article/details/46042809 Nginx 做反向代理,后端是 tomcat,chro ...

  3. springmvc 加载静态文件失败

    header.jsp,部分代码 <head> <title>QA|VIS_PLATFORM</title> <meta content="width ...

  4. [MyBean说明书]-添加IApplicationContextEx01接口手动加载库文件

    主控台接口实现了IApplicationContextEx01接口,可以手动执行加载DLL和配置文件,具体使用方法可以参见DEMO(samples\manualLoadLib)   IApplicat ...

  5. 为什么在soui中加载JPG文件失败

    在SOUI中解决解码器是一个独立的模块.不同的解码器决定了程序中能够加载什么样的图片类型.使用SComMgr来加载SOUI的模块时,debug模式下默认的图片解码器是imgdecoder-png.这个 ...

  6. protel 99se 加载库文件 files not recognised 解决办法-转

    WIN7操作系统下,protel99se添加元件库的操作方法(非修改ADVSch99SE方法) 最近更换了新电脑,操作系统是正版的WIN7,在用protel时发现元件库无法加载,很是郁闷,上网查找解决 ...

  7. MFC使用LoadBitmap方法加载位图文件失败解决方案(转)

    用如下方法在原项目中使用LoadBitmap方法加载已有的位图资源作为背景没有问题,但放在别的项目中总是加载不出来,该函数返回NULL HBITMAP hBitmap=LoadBitmap((HINS ...

  8. Django加载静态文件失败,已解决

    1.css文件以及js文件要放在static目录下,static和templates属于同级目录 2.在Django项目的同名项目文件的setting.py中,最后添加静态文件夹static目录路径 ...

  9. Android 4.X 系统加载 so 失败的原因分析

    1 so 加载过程 so 加载的过程可以参考小米的系统工程师的文章loadLibrary动态库加载过程分析 2 问题分析 2.1 问题 年前项目里新加了一个 so库,但发现native 方法的找不到的 ...

随机推荐

  1. Oracle 表分析

    ANALYZE TABLE SeikyuTbl COMPUTE Statistics FOR TABLE FOR ALL COLUMNS FOR ALL INDEXES ; 一.优化器的优化方式 Or ...

  2. weblogic 的应用 常见问题处理 db2 链接不上(转载)

    xingkaistart weblogic10之Failed to initialize the application 'wss-1-1' due to error weblogic. Weblog ...

  3. 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件

    概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...

  4. (转)Maven实战(二)构建简单Maven项目

    上一节讲了maven的安装和配置,这一节我们来学习一下创建一个简单的Maven项目 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:gene ...

  5. C语言文件详解

    1.C语言FILE类,在stdio.h头文件中,FILE类是一个结构体:定义如下: 通过typedef定义了 文件类型 的别名: “FILE”,这样以后需要读写文件的时候直接定义FILE就行了.   ...

  6. EA+svn实现UML的版本号控制

    一.安装软件 1.VisualSvn Server svnserver 2.Tortoise Svn svnclient 3.Slik-Subversion-1.7.8-x64版本号控制插件 4.En ...

  7. HDU 4099 Revenge of Fibonacci (数学+字典数)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4099 这个题目就是一个坑或. 题意:给你不超过40的一串数字,问你这串数字是Fibonacci多少的开头 ...

  8. mvc之验证IEnumerable<T> 类型

    假设我们有这么一种需求,我们要同时添加年级和年级下面的多个班级,我们一般会像下面这种做法. Action中我们这样接收: [HttpPost] public ActionResult CreateGr ...

  9. 左右TextView旋转门问题

    最近由于旋转门问题的一个客户找我,当在字符25更多的时候是不是走了,后来,我在重现的问题,发现问题如下面: 问题1.人物25几个月之内可以去. 问题2.在人物25个月,虽然比屏幕宽度,不去 问题3.屏 ...

  10. C++11: final与override

    C++11中增加了final与override关键字,貌似是从Java语言中借鉴而来,用途也一样.看例子代码: 01.#include <iostream> 02.  03.using n ...