如何将Linux中现有的众多资源以最小代价移植到android是很多开发人员关注的,下面这篇文章讲了一个比较取巧的方法,我试验了一下,最基本的hello world可以跑,但是复杂的大型程序要考虑很多问题,thread,IPC,效率等等,还有待验证。
原文地址:
在Android上使用动态链接库的一种新方法 - 不使用android linker
Android使用的Linker和传统Linux使用的linker(ld.so,ld-linux.so.2,ld-linux.so.3)不同,
他的Bionic里面的libdl实际只是一个stub函数,真正的实现都在system/bin/Linker里面。
我认为ld.so针对a.out格式的二进制可执行文件, ld-linux.so.2针对elf格式的二进制可执行文件,
ld-linux.so.3是新一代针对elf格式的二进制可执行文件的Linker,错了的话请纠正。
实际上我试验使用ld-linux.so.3代替android的/system/bin/linker来作为系统动态链接库的
linker。
下面给出一个简单的例子:
hello.c
#include
int main()
{
printf("\n Hello World \n");
return 0;
}
所用的Toolchain从Code Sourcery得到。使用的是arm gnu/linux系列。
编译方式:
arm-none-linux-gnueabi-gcc -o hello.out hello.c -Wl,-dynamic-linker=/yourpath/ld-linux.so.3 (不要使用-static使得程序是动态链接)。
然后找到hello.out依赖的动态库,这里给出的列表是我猜的(因为我的cgywin里没有ldd)。
ld-linux.so.3,
libgcc_s.so,
libc.so.6
(其实用readelf -d也可以找到依赖的动态库。)
我把这些文件从toolchain库(libc/usr/lib)里面找出来然后上传到android emulator的/data/app目录。
然后将hello.out上传到同一个目录后然后改变其权限使其可执行(chmod).然后执行它,
OK !!you can get it!!
因此,所有的程序不管它是否动态链接库还是其他的,如果在host系统toolchain能成功按上面方法编译,那理论上它就可以在android系统上运行。你只需要将程序和相应的动态库上传到合适的目录。
记住最关键的,编译时一定要加上“-Wl,-dynamic-linker=/yourpath/ld-linux.so.3" 。
注意,这里的youpath要和你在android模拟器上执行这个程序时的路径一样,否则会出not found错误。最好把ld-linux.so.3拷贝到编译目录,并且执行时所有文件都在同一个目录。
阅读(4763) | 评论(0) | 转发(1) |