转:如何在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/C++在Android开发中的应用

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

直接在android上运行c++程序

1.       C4Droid:直接在手机上进行代码编写和编译. 参考: http://bbs.gfan.com/thread-3874081-1-1.html 2.       怎样用...
  • lchunli
  • lchunli
  • 2012年04月04日 21:17
  • 5170

(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
  • 1332

用C++写android程序(包含界面+发短信)

首先为什么要用C++写android程序呢?
  • bupt073114
  • bupt073114
  • 2014年10月07日 11:18
  • 5298

C++和android进行socket通信小结

本人的C++和android水平都很soso,但是被导师赶鸭子上架,负责实现C++和android进行socket通信的问题,只能硬着头皮研究了。 网上关于C++和android通信的问题研究的很少,...
  • yxg190221
  • yxg190221
  • 2014年01月06日 16:27
  • 1542

用C/C++开发android应用

在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用andro...
  • srplab1
  • srplab1
  • 2012年05月30日 22:21
  • 43017

举例说明如何用IKAnalyzer实现在android应用程序上面的中文分词

我用的jar包及其版本为:IKAnalyzer2012_u6.jar、lucene-analyzers-3.6.1.jar、lucene-highlighter-3.6.1.jar、lucene-co...
  • Ada168855
  • Ada168855
  • 2013年05月24日 13:07
  • 2958

编译可在Android上运行的可执行文件:C/C++交叉编译环境

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://androidguy.blog.51cto.com/974126/1122861 ...
  • Pansing
  • Pansing
  • 2013年09月20日 01:13
  • 1484

用C++写android程序(包含界面+发短信)

首先为什么要用C++写android程序呢?
  • bupt073114
  • bupt073114
  • 2014年10月07日 11:18
  • 5298

c++程序移植到android上问题记录

2013-5-30 第一个错误解决: 去掉改成#include  函数中并没有用到该头文件。 只有cout cin 会用到这个头文件 第二个错误: 改成#include  第三个错误...
  • Tan37Lu
  • Tan37Lu
  • 2014年04月18日 11:56
  • 1187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转:如何在android设备上面跑C或C++程序?
举报原因:
原因补充:

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