Android 是基于 Linux 的 OS,所以想要在 ARM 的 Linux 上,比如树莓派,是有可能的。但事实上其中还是有问题,主要是因为 Android 的 so 库是通过 Bionic libc 代替了 glibc 作为标准库,两者有很多的差别,无法直接移用。

为了解决这个问题,出现了 libhybris 这个库,其主要作用是将 Android 库对 Bionic libc 的方法引用,Link 到 glibc 上,以实现对 Android 库在 ARM Linux 上的支持。libhybris 原来是用于让各 Linux 发行版支持 Android 的驱动,比如 Ubuntu Touch 和 Sailfish OS 都是使用这个库来兼容 Android 设备的。原理图如下:

libhybris主要作用是为了解决libc库的兼容问题,目的是为了在基于GNU C library的系统运行那些用bionic编译的库(主要是Android下的闭源HAL库)。它在Ubuntu touch, WebOS, Jolla Sailfish OS等系统中都有使用。因为这些系统都是基于glibc生态的,然而现有的硬件厂商提供的driver多是为Android而写的,自然也是用bionic编译的。那么问题来了,说服厂商再写一套驱动不是那么容易的,就算写出来也需要经过一段时间才能变得成熟。那如何让基于glibc的系统能够重用现有Android的driver呢?这就需要像libhybris这样的兼容层。

1、库的编译
              首先你需要准备一套跑linux系统的arm架构机器,最好装最新的debian或ubuntu系统。这样编译是不会出一些奇怪的错误

下载libhybris源码
# git clone  https://github.com/libhybris/libhybris.git
# ./autogen.sh

如果出现checking for android-headers...no。停止,并没有生成Makefile文件。下面给你解决,如果是其他错误请自行百度(一般都是环境没好)

这个android-headers是什么东西呢,我也搞了好久,不过在源码的utils/extract-headers.sh中发现有android-headers字样

ANDROID_ROOT 当然是android源码咯, android-headers可以去ubuntu系统官网下载

下载后运行脚本

提取android头文件
# ./extract-headers.sh  android-aosp/  /tmp/android-headers/  4 2 2
这里4 2 2编译不过,就去掉了4 2 2 ,
然后在android-headers目录
# make install。

之后再回到libhybris运行./autogen.sh ,无错误。make 编译后有libandroid-properties.so、libhybris-common.so。将其拷贝置/usr/lib文件目录下,include文件拷贝到、/usr/include目录下。当然你可以用make install ,只是其他库我不知道用,所以没有拷贝

之后再在根目录下新建/system/lib64目录(我系统是64位的)此目录下存放android的库及其依赖库。将android的build.prop拷贝置system目录下

2、库的使用
Android.mk:

LOCAL_PATH:=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= libfooLOCAL_SRC_FILES:= foo.cppinclude $(BUILD_SHARED_LIBRARY)

foo.cpp:

#include <stdio.h>#include <stdlib.h>void foo(void){printf("foo\n");printf("%s\n", getenv("PATH"));}void bar(void){foo();printf("bar\n");}
android库拷贝至linux系统的/system/lib64目录下通过libhybris,调用bar函数:#include <stdio.h>#include <hybris/common/dlfcn.h>#include <string.h>#include <errno.h>int main(void){void *handle;void (*bar)(void);handle = hybris_dlopen("libfoo.so", RTLD_NOW);if (NULL == handle){fprintf(stderr, "android_dlopen failed: %s\n", strerror(errno));return -1;}bar = (void (*)(void))hybris_dlsym(handle, "_Z3barv");if (NULL == bar){fprintf(stderr, "fail to dlsym: %s\n", strerror(errno));return -1;}bar();return 0;}

使用libhybris库linux调用android库相关推荐

  1. CMake从0到1:Linux编译动态库,调用动态库,VSCode单步执行

    工欲善其事必先利其器,如果要想在Linux系统上编写C++代码,常常我们会有如下几个需求: 1.编译可执行文件 2.可执行文件调用动态库,这里通常包括两种情况:(1)自己的动态库,那就得先生成再链接: ...

  2. linux 调用动态库so文件

    关于动态调用动态库方法说明 一.        动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数).可以 ...

  3. qt linux 调用外部库文件 (safenet加密狗开发一)

    一加密狗开发基本原理: 经过我的探索,加密狗的基本原理就是每个加密狗有不同的id,根据加密狗的id生成独一无二的库文件,然后再在程序中加入vendorcode文件,比对插入的加密狗和code文件,如果 ...

  4. qt调用import sys库_QTCreator调用动态库实例

    在 linux 中, qt 里面已经集成了最新的开发平台 QT Creator ,下面是我练习调用动态 库( .so 文件)的例程: 1 .打开 QT Creator ,点击 File -> N ...

  5. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  6. linux 认证考试 题库,Linux认证考试题库及答案

    1.一个文件的'权限是-rw-rw-r--,这个文件所有者的权限是什么() a.read-only b.read-write c.write 答案 b 2.下面哪个值代表多用户启动() a.1 b.0 ...

  7. 深圳linux测试题库,Linux认证考试题库及答案

    Linux认证考试题库及答案 1.一个文件的权限是-rw-rw-r--,这个文件所有者的'权限是什么() a.read-only b.read-write c.write 答案 b 2.下面哪个值代表 ...

  8. linux链接curl库,Linux利用curl库快速开发http应用

    熟悉Linux系统的人不可能不知道curl的鼎鼎大名吧?curl是将http请求封装的相当好的库,详见http://curl.haxx.se/,我们可以利用curl实现快速http请求的开发. 在Li ...

  9. matlab调用opencv库,matlab调用opencv库

    matlab中有许多图像处理的函数简单方便,比如矩阵x 求垂直积分 直接sum(x) 就可以了.不知道OPENCV里面有没有类似的功能,反正我是没找到.就准备用matlab调用OPENCV里面的函数. ...

最新文章

  1. java方法未定义类型_java - 方法未定义为类 - SO中文参考 - www.soinside.com
  2. python tqdm包_python tqdm库的使用
  3. 【Android 性能优化】应用启动优化 ( 启动白屏问题 | 应用启动时间测量 | 冷启动 | 热启动 | 应用启动时间计算源码分析 )
  4. 软核、固核、硬核的区别【转】
  5. java swing jbutton_Java 反射
  6. spring----Bean的生命周期和循环依赖
  7. 1030 Travel Plan(甲级)
  8. 马云无偿划转阿里股权?蚂蚁集团回应:假消息
  9. 插件代码_我们开源了一款 SonarQube iOS 代码扫描插件
  10. Mysql 忘记密码怎么办(win10)
  11. java三级分销_java版微信三级分销完整源码
  12. (2)量化交易学习-股票数据下载
  13. 在opencv中如何生成灰度图
  14. arcgis如何打开tif_详解如何使用ArcGIS生成高程点
  15. 响应式织梦模板日化食品零食类网站
  16. uni-app的常用功能查询,uni-app入门级使用指南。
  17. java中load_Load Java参数描述的细节
  18. CH579实现一个最小外围设备(Peripheral)
  19. 十五铬钼钢板和十二铬一钼钒钢板的区别
  20. 2023第三届人工智能与机器学习国际学术会议(ICMLAI 2023)

热门文章

  1. npm install socket.io 提示缺少VCBuild.exe
  2. 《移动App测试的22条军规》—App测试综合案例分析23.11节测试微信App对多语言和地区的支持...
  3. 30岁前不要让人生留下遗憾笔记
  4. github速成手册
  5. 基于序列图像的三维体绘的视线投射算法
  6. WindowsXP如何设置共享权限
  7. r 选取从小到大的数据_r 选取数据库
  8. linux程序文本,Linux之文本处理
  9. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法
  10. ospf 指定dr_OSPF的基本配置及DR /BDR选举的实验