文档章节

Linux程序移植到Android上

shzwork
 shzwork
发布于 07/03 21:00
字数 854
阅读 42
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

序言:

由于本人还是比较偏重于先说明原理在说明实际操作步骤,要知其然更要知其所以然,如下图所示:

Linux程序移植到Android上

传统的linux系统中的程序基本都依赖于glibc(至于什么是glibc可以百度去),而右边AOSP(Android Open-Source Project)的程序基本都是依赖于Bionic(由谷歌公司开发类库,用来替代glibc)。这就决定了要想移植linux上的程序到android上就必须解决这个依赖的类库不同的问题。

一般情况下,有两种方法。

一个就是将程序静态编译,将程序中所有需要的库全部编译进可执行文件中。这样程序在android中运行就不需要链接任何动态库了。但是带来一个非常大的弊端就是这个程序会非常大,资源利用会非常低下。一个简单的helloWorld!都可以达到好几百k!

另一个就是用ld-llinux.so.3来替代android系统中/system/bin/linker来作为链接器进行动态链接,当然这就需要将相应的动态库也拷贝到android中(个人理解,如果表述不够准确请指正)。这样就可以进行动态链接,并且正常运行了。

静态编译方法:

首先我们以移植一个helloworld程序作为例子。

#include<stdio.h>

void main()

{

printf("HelloWorld!\n");

}

输入命令进行静态编译:arm-none-linux-gnueabi-gcc hello.c -static -o hello.out

然后利用adb push 将helllo.out放进android设备的/system/bin目录中,

用chmod 755 /system/bin/hello.out 更改其为执行权限。

输入: hello.out 即可看到屏幕上输出HelloWorld!

如上说所一样,这个hello.out程序有近650k,而且其使用的代码不可重用。

动态链接方法:

动态链接依旧按照上述helloworld程序作为例子。

编译命令为:arm-none-linux-gnueabi-gcchello.c -ohello.out -Wl,-dynamic-linker=/system/lib/ld-linux.so.3

这里需要说明的是,这个/system/lib是指android手机中存放连接器ld-linux.so.3的目录。正式利用这个连接器来替代android系统中/system/bin/linker才能动态链接运行程序。

编译完成后,可以输入命令 readelf -d hello.out 来查看它的动态链接库有哪些。比如这个helloworld程序的动态链接库如下图所示:

Linux程序移植到Android上

可以看到libgcc_s.so.1和libc.so.6就是这个helloworld所需要的动态链接库。

然后找到arm-none-linux-gnueabi-gcc的安装目录。如果你是解压压缩包配置path的安装路径的话,这些动态链接库文件就在./arm-none-linux-gnueabi/libc/armv4t/lib 下。

找到ld-linux.so.3和上述需要的动态链接库,将他们cp 出来。

然后,利用adb push 将他们放入android系统的/system/lib目录下,将hello.out放入到/system/bin下,更改hello.out和ld-linux.so.3的权限为可执行即可(chmod 755 hello.out)。这里需要说明一下,ld-linux.so.3作为他们的连接器,一定需要可执行权限,否则就会提示permission denied。

做好这些后,输入hello.out 即可看到屏幕打出helloworld!

shzwork

shzwork

粉丝 18
博文 1159
码字总数 21100
作品 0
厦门
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
708
1
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.7K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
Linux 反汇编工具--LDasm

LDasm (Linux 反汇编工具) 是一个基于 Perl/TK 的 objdump/binutils 图形化工具,试图模仿 W32Dasm 工具的外观。可搜索相互参照,将代码从 GAS 转换成 MASM 风格代码等等。...

匿名
2013/01/22
5.7K
1
Android3D应用与游戏开发框架--JQGL

JQGL 是一款针对Android设备上3D应用、游戏的开发框架。 核心功能是OpenGL-ES的使用框架,相对于大部分开发者而已,OpenGL是陌生的,没有专门研究无法进行相关的开发。 本框架针对于Android...

Jping
2013/02/21
1.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何查看仅一个用户提交的git日志? - How can I view a git log of just one user's commits?

问题: 使用git log ,如何按用户筛选,以便仅看到该用户的提交? 解决方案: 参考一: https://stackoom.com/question/HsDc/如何查看仅一个用户提交的git日志 参考二: https://oldbug.net...

富含淀粉
38分钟前
6
0
【Pyecharts Gallery】中看不中用的可视化作品集合~

摘自: https://www.kesci.com/home/project/5ecd20d0c1a73900361b92b5 var myColor = ['#eb2100', '#eb3600', '#d0570e', '#d0a00e', '#34da62', '#00e9db', '#00c0e9', '#0096f3', '#33CCF......

tengyulong
今天
10
0
《Java8实战》笔记(03):Lambda表达式

本文源码 Lambda 管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 Lambda表达...

巨輪
今天
7
0
从其他文件夹导入文件 - Importing files from different folder

问题: I have the following folder structure. 我有以下文件夹结构。 application/app/folder/file.py and I want to import some functions from file.py in another Python file which r......

javail
今天
22
0
大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部