序言:

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

传统的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程序的动态链接库如下图所示:

可以看到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!

Linux程序移植到Android上相关推荐

  1. 将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...

    各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误 (2012-04-11 00:43:47) 标签: linux c程序 杂谈 各位大侠:我把原来在linux运行的c程序移植到 ...

  2. Linux程序下载到板子上,uclinux系统移植到bf561板子上过程

    uclinux系统移植 主要工作包括: 1.选择处理器对应的交叉编译器(交叉编译器,运行于通用机上,目的为了编译出能够在特定平台上运行的软件) 2.选择并修改bootloader 3.修改链接文件,定 ...

  3. 让Qt应用程序跑在Android上

    Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows.跑linux.跑MAC--如今移动平台android操作系统如此火爆,Qt当然不能放过对android的支持,对了,还有iph ...

  4. Go编译android,go语言的程序跑在android上

    之前写了一个检查页面的golang程序http://www.simonzhang.net/?p=1346.就用这个测试一下放到android上看看效果如何.但是我在windows上的golang还是产 ...

  5. android用什么更新应用程序,如何在Android上更新应用程序 教你如何更新安卓手机APP...

    您从Play商店下载的大多数Android应用程序都会出于各种原因而定期提供更新:添加功能,错误修复,提高安全性...了解如何在Android智能手机上管理应用程序以及如何使它们保持最新. 如果您想要 ...

  6. android指南针程序,如何在Android上制作精确的指南针

    我的Android应用程序显示了世界上某个地方的方向,因此需要获得罗盘度. 这是我一直用来计算学位的代码: public void getDirection() { mySensorManager = ...

  7. 把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)

    感谢博客园不再封杀,差点儿搬家的念头都产生了,博客园还是有大胸怀,继续留在博客园写口水文应该没错,娱乐自己.娱乐大家,给枯燥的编程生活增加一点儿笑料,也给大家充当个开心果,让大家高兴一下下.轻松一下下 ...

  8. Linux程序之触摸,Android(Linux)模拟按键、触摸屏等事件

    前提: 在我们应用程序或者在写Android自动化测试时候常常会需要模拟实体按键,来给我们做测试用.这也是我要整理的目的.主要的涉及的是Linux Input Event事件.以下的例子基于Andro ...

  9. 1_机智云程序移植到HT32F52352上

    一.WiFi模块烧录机智云的固件 WiFi模块用的是正点原子的ATK-ESP-01,Flash的大小是8Mbit,机智云对应的固件可在此下载. 如点击资源下载没有反应,则在资源下载处右键,选择这三个中 ...

最新文章

  1. 2.0 解析系列 | 一文详解新一代OceanBase云平台
  2. java b2b2c开源商城系统源码
  3. hdu5251最小矩形覆盖
  4. netbean创建jsf项目
  5. 树结构练习——排序二叉树的中序遍历
  6. CV之Face Detection:Face Detection人脸检测原理及其常见分类技术
  7. Boost::context模块fiber的jump_mov测试程序
  8. pywinauto二次封装(pywinnat.py)
  9. flog和flag_FLAG:写作,英语和持续学习
  10. ubuntu10.4的更新源因过期无法更新的解决方法
  11. [转载] 杜拉拉升职记——34 设定工作目标要符合“SMART”原则
  12. c语言程序下三子棋,C语言实现三子棋游戏(初级版)
  13. MongoDB compass 连接不上远程服务器的解决方法
  14. oracle 查看最大连接数与当前连接数
  15. Anaconda3安装以及常用命令
  16. 24X24 黑体简体中文点阵字库
  17. 做微信公众号淘宝客返利系统必须要知道3件事儿
  18. 一文看清Libra全景(超长22000字,慎点)
  19. 网站建设好但是访问不了的原因及解决方法
  20. JS输入语句与输出语句

热门文章

  1. 【Android 逆向】Frida 框架 ( Frida 框架使用环境 | Frida 框架作用 | Frida 框架模块 )
  2. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )
  3. 【错误记录】Android 中调用 Process 命令行执行指令 ( java.lang.IllegalThreadStateException: process hasn‘t exited )
  4. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
  5. MySQL查询日志介绍
  6. 实现一个 WPF 版本的 ConnectedAnimation
  7. 网络嗅探与欺骗(FTP部分)
  8. Hibernate中的Entity类之间的继承关系之一MappedSuperclass
  9. maven 在 mac中的配置
  10. 取得select框的text