转:如何在android设备上面跑C或C++程序?

转载 2016年08月28日 18:39:43

当然,最原始的方法是把你的程序编成静态的,即编译时加参数-static即可。但这不符合我们一般的习惯,也是我无法容忍的。

方法还是有的:

1、compile

arm-unknown-linux-gnueabi-gcc -o hello hello.c -Wl,-dynamic-linker=/data/app/ld-linux.so.3

这样,编出来的hello就会使用/data/app/ld-linux.so.3当作动态库加载器

qj@king:~/test$ readelf -a hello|grep ld-linux
      [Requesting program interpreter: /data/app/ld-linux.so.3]

2、run, 由于Android上并没有所以需要我们自己拷贝ld-linux.so.3上去。

copy ld-linux.so.3 to /data/app

copy libc.so.6 to /data/app

修改LD_LIBRARY_PATH以把我们的程序所依赖的其它动态库加入搜索路径,在adb shell下执行:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/app

注意,在android下只有data目录是可写的,其它目录都是只读的,所以只能用data目录了。

more info:

-Wl,option
Pass option as an option to the linker. If option contains commas, it is split into
multiple options at the commas. You can use this syntax to pass an argument
to the option. For example, ‘-Wl,-Map,output.map’ passes ‘-Map output.map’
to the linker. When using the GNU linker, you can also get the same effect
with ‘-Wl,-Map=output.map’.

即-dynamic-linker 传递给了linker。注意,上面介绍的两种写法,一种是等号传递;另一种是逗号传递。效果是一样的。

下面是对连接器ld中参数--dynamic-linker的解释:

#ld --help

  -I PROGRAM, --dynamic-linker PROGRAM
                              Set PROGRAM as the dynamic linker to use

ld-linux.so.3、libc.so.6等是从toolchains下面拷来的。

实际上ld-linux.so.3是指向ld-2.9.so的链接,所以实际上需要把ld-2.9.so拷贝到/data/app目录下,然后做一个链接:

ln -s ld-2.9.so ld-linux.so.3

虽然ld-2.9.so看上去是个动态库,但实际上它是可执行的。加载它会被执行,所以需要给它增加可执行权限,否则执行时会提示说not found 之类的,总之android shell下的这个提示很难让人理解:

chmod 777 ld-2.9.so

chmod 777  ld-linux.so.3

如果你的代码是C++写的,编译需要使用arm-...linux...-g++,而且运行时还需要把libstdc++.so.6拷贝到/data/app目录下去。

另外,还有一个关键点:

一定要把/data/app加入到LD_LIBRARY_PATH环境变量中。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/app

以上步骤完成后,基本可以保证能成功运行,已经经过了我的多次验证。

 参考资料:https://groups.google.com/forum/?fromgroups=#!topic/android-internals/fHKKNkdPvAU

相关文章推荐

我的技术转型之路——从C++到Android (一)

作为一个程序员,学习是工作必不可少的一个环节,从学习新的API、类库、IDE的使用到学习一种全新的开发语言,我们跟随着时代的脚步不断挑战和改变着自己。而所谓技术转型到底多大幅度才算,其实也很难说得清,...

(转)在你的android手机上写C/C++程序

在你的android手机上写C/C++程序          只要你是安卓的机子,写C无需root,写C++还是要滴。那么你就可以在自己的手机上编写C/C++程序,并且可以本地编译运行,堪称...

(OK) 在Android系统上运行C/C++程序

http://blog.chinaunix.net/uid-14735472-id-5214306.html # export PATH=$PATH:/opt/android-on-linux/...
  • ztguang
  • ztguang
  • 2016年03月31日 20:43
  • 1083

在Android系统上运行C/C++程序

1. 安装NDK; 2. 编写hello.c源文件 #include int main() {         printf("hello, arm c world!\n")...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android手机运行c/c++程序

android手机可以运行C/C++可执行程序 具体运行使通过adb将可执行文件通过adb push命令上传到Android手机上 adb push elf_file /data/push_fil...

android实现app通过jni调用C/C++方法

本文实现在android app中使用调用jni库调用本地C/C++方法。 1.新建android工程 2.新建java上层方法 本例子在工程中新建 cn.landsem.jnistudy 包,在其中...
  • yxtouch
  • yxtouch
  • 2016年09月02日 20:13
  • 3317

C/C++在Android开发中的应用

Android是基于Linux内核的一个手机操作系统,谷歌提供了开发包(Android SDK),程序员可以通过开发包开发Android App(应用程序)。Android SDK提供Java语言接口...

android使用C/C++调用SO库

分类: android2012-05-11 02:24 1470人阅读 评论(3) 收藏 举报 有时候,我们反编译apk得到一个so库,如果直接使用这个so库的话,必须使用原来so库同样的p...

<android>头像上传,打开相册 —— 图片压缩——上传成功 (附三星手机适配图片旋转问题)

你还在一模块一模块的做上传头像吗,先搜索打开相册的代码,适配、测试,再找压缩图片方法,测试。再找上传的方法,再测试。小弟不喜欢麻烦,自己写了一个总结性的博客,还望大家多多指出不足和缺点。能帮到大家是最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转:如何在android设备上面跑C或C++程序?
举报原因:
原因补充:

(最多只允许输入30个字)