在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序 (学习老罗的)

不得不说,老罗写的太好了。


按照他的方法,我两次就成功了。

不过有点让人奇怪的地方就是

第一次我make snod是成功的

但是执行如下代码:

      root@android:/ # cd system/bin

      root@android:/system/bin # ./hello

的时候,确发生了错误。

第一次可能是因为我没有

执行$ source ./build/envsetup.sh

和$ lunch full-eng

结果ut/target/product/gerneric/system/bin只有一个hello,其他的文件都不见了。


第二次,我又操作了一边,成功了。








转自:http://blog.csdn.net/luoshengyang/article/details/6571210

在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序。在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello、proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val。进一步,还通过cat命令来直接访问/proc/hello和/sys/class/hello/hello/val文件来,以验证驱动程序的正确性。在这一篇文章里,我们将通过自己编写的C可执行程序来访问设备文件/dev/hello。可能读者会觉得奇怪,怎么能在Android系统中用C语言来编写应用程序呢?Android系统上的应用程序不都是Java应用程序吗?其实是可以的,读者不妨用adb shell命令连上Android模拟器,在/system/bin目录下可以看到很多C可执行程序,如cat命令。今天,我们就来学习一下怎么在Android系统中添加用C语言编写的可执行程序吧。

      一. 参照在Ubuntu上为Android系统编写Linux内核驱动程序一文,准备好Linux驱动程序。使用Android模拟器加载包含这个Linux驱动程序的内核文件,并且使用adb shell命令连接上模拟,验证在/dev目录中存在设备文件hello。

      二. 进入到Android源代码工程的external目录,创建hello目录:

      USER-NAME@MACHINE-NAME:~/Android$ cd external

      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello

      三. 在hello目录中新建hello.c文件:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <fcntl.h>  
  4. #define DEVICE_NAME "/dev/hello"  
  5. int main(int argc, char** argv)  
  6. {  
  7.     int fd = -1;  
  8.     int val = 0;  
  9.     fd = open(DEVICE_NAME, O_RDWR);  
  10.     if(fd == -1) {  
  11.         printf("Failed to open device %s.\n", DEVICE_NAME);  
  12.         return -1;  
  13.     }  
  14.       
  15.     printf("Read original value:\n");  
  16.     read(fd, &val, sizeof(val));  
  17.     printf("%d.\n\n", val);  
  18.     val = 5;  
  19.     printf("Write value %d to %s.\n\n", val, DEVICE_NAME);  
  20.         write(fd, &val, sizeof(val));  
  21.       
  22.     printf("Read the value again:\n");  
  23.         read(fd, &val, sizeof(val));  
  24.         printf("%d.\n\n", val);  
  25.     close(fd);  
  26.     return 0;  
  27. }  

      这个程序的作用中,打开/dev/hello文件,然后先读出/dev/hello文件中的值,接着写入值5到/dev/hello中去,最后再次读出/dev/hello文件中的值,看看是否是我们刚才写入的值5。从/dev/hello文件读写的值实际上就是我们虚拟的硬件的寄存器val的值。

      四. 在hello目录中新建Android.mk文件:

      LOCAL_PATH := $(call my-dir)

      include $(CLEAR_VARS)

      LOCAL_MODULE_TAGS := optional

      LOCAL_MODULE := hello

      LOCAL_SRC_FILES := $(call all-subdir-c-files)

      include $(BUILD_EXECUTABLE)

      注意,BUILD_EXECUTABLE表示我们要编译的是可执行程序。 

      五. 参照如何单独编译Android源代码中的模块一文,使用mmm命令进行编译:

      USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello

      编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件hello了。

      六. 重新打包Android系统文件system.img:

      USER-NAME@MACHINE-NAME:~/Android$ make snod

      这样,重新打包后的system.img文件就包含刚才编译好的hello可执行文件了。

      七. 运行模拟器,使用/system/bin/hello可执行程序来访问Linux内核驱动程序:

      USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

      USER-NAME@MACHINE-NAME:~/Android$ adb shell

      root@android:/ # cd system/bin

      root@android:/system/bin # ./hello

      Read the original value:

      0.

      Write value 5 to /dev/hello.

      Read the value again:

      5.

      看到这个结果,就说我们编写的C可执行程序可以访问我们编写的Linux内核驱动程序了。

      介绍完了如何使用C语言编写的可执行程序来访问我们的Linux内核驱动程序,读者可能会问,能不能在Android的Application Frameworks提供Java接口来访问Linux内核驱动程序呢?可以的,接下来的几篇文章中,我们将介绍如何在Android的Application Frameworks中,增加Java接口来访问Linux内核驱动程序,敬请期待。

老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!

43
0
查看评论
40楼 gulingyun789 4天前 11:12发表 [回复]
android中跑c应用程序,lz这个是一种方法,不过貌似过程多,不过对于学习确实很好的资料,还有简单的方法,就是安装交叉编译工具,直接arm-none-linux-gnueabi-gcc -static -o hello hello.c , 然后push到手机上,chmod下hello的权限,./hello运行
39楼 zl1zl2zl3 2013-06-09 11:00发表 [回复]
谢谢楼主,已买书支持!
38楼 lovebeyond1014 2013-06-02 23:46发表 [回复]
谢谢楼主,已买书支持!
37楼 livagain1988 2013-03-21 14:57发表 [回复]
你好,我按照您的方法都实现了,除了最后make snod,虽然前面在 bin中生成了hello二进制可执行文件,但是make snod以后,从虚拟机进入/system/bin文件夹并没有hello这个可执行文件,为什么make snod未能将hello重新打包进新的system.img呢? 望给些意见
36楼 all8023 2013-03-21 10:35发表 [回复]
罗老师,请教个问题,我在友善的tiny210v2板子上实验,板子里的系统里有led灯的驱动,也有基于android 的测试程序,我想直接写个C程序按照本文的编译方法测试一下它自带的驱动(厂家已把led驱动编译到内核里),但是根据C程序打印的信息来看能正常执行,就是灯不亮,麻烦帮忙分析一下。
35楼 daizhx 2013-02-04 14:38发表 [回复]
LZ V5写的太好了
34楼 binglansong 2012-12-26 17:10发表 [回复]
请问楼主,我是装的实体机的ubuntu,用天嵌的安卓源码,没有可以装mmm命令的可执行文件啊,你帖子里讲的东西,不在虚拟机,在实体机上可以实现吗
Re: 罗升阳 2012-12-26 17:15发表 [回复]
回复binglansong:可以的,使用mmm命令之前,要先执行一个脚本,参考:http://blog.csdn.net/luoshengyang/article/details/6566662。
33楼 xzjlcyz 2012-12-18 11:18发表 [回复]
好吧,是百万
Re: 罗升阳 2012-12-18 11:31发表 [回复]
回复xzjlcyz:比我预想的快,只用了3分钟的样子:1000002次
Re: 喜物悲己 4天前 16:32发表 [回复]
回复Luoshengyang:来学习了,赶上200W的里程碑了。楼主V5,我等膜拜。
Re: 罗升阳 2012-12-18 11:27发表 [回复]
回复xzjlcyz:可能不用10分钟就要冲上百万了,可惜啊,不知道是谁,不然我可以送一本书给他:)
32楼 xzjlcyz 2012-12-18 11:17发表 [回复]
访问量要破10w了,不晓得强的到第10w么
31楼 longkg 2012-11-21 15:28发表 [回复]
按照老罗的Android.mk,我的系统编译没办法通过,说找不到main的入口。后来加入了下面两句就通过了
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_EXPORT_LDLIBS := -llog
我的系统是4.0.3
Re: 罗升阳 2012-11-21 15:33发表 [回复]
回复longkg:博客上的文章都是基于2.3的,碰到这种问题,最好就是参考一下相同类型的工程的Android.mk是怎么写的~
30楼 yuzhoulangzi2008 2012-10-23 17:32发表 [回复]
相当精彩。。。
29楼 binghezhouke 2012-08-14 16:49发表 [回复]
楼主,发现一个小问题,c语言换行的时候是不是应该是“\n”啊
Re: 罗升阳 2012-08-14 16:59发表 [回复]
回复binghezhouke:是的,这一系列的文章的代码里面的反斜杠不知道怎么都变成斜杠了,之前发现的都改过来了,这里我再改一下,多谢指正。
28楼 jeffade 2012-07-18 10:46发表 [回复]
你好,我编译的时候出现一下错误。不知博主能否给些建议。谢谢
make:进入目录'/home/weide/share/android/android_gingerbread'
make: *** 没有规则可以创建“out/target/product/generic/obj/EXECUTABLES/myled_intermediates/LINKED/myled”需要的目标“out/target/product/generic/obj/lib/crtbegin_dynamic.o”。 停止。
27楼 天才2012 2012-07-10 11:41发表 [回复]
android的终端下面当然可以跑C程序,楼主分析的很好
26楼 lqxandroid2012 2012-07-09 16:20发表 [回复]
不错,不错,我还以为只能在linux kernel下写呢。不过是我们脑子太僵硬,HAL 就是c语言写的,这样写肯定可以的了。呵呵。
不过楼主是原生态,android,我的S5pv210的android2.3 居然不支持 mmm ./external/hello
编译
只能make hello.so 来编译。
Re: lqxandroid2012 2012-07-09 16:46发表 [回复]
回复lqxandroid2012:晕,居然make hello.so 也不出来,不知道咋回事提示错误
说 make 没有 创建hello. so 的规则。咋回事啊
用楼主的mmm 命令也是一样的结果。
提示mmm 找不到命令..............
Re: lqxandroid2012 2012-07-09 16:55发表 [回复]
回复lqxandroid2012:搞定了, 晕死,是我自己没注意楼主前一篇文章,看的不够仔细,出来了。呵呵。
Re: 罗升阳 2012-07-09 16:49发表 [回复]
回复lqxandroid2012:mmm命令要加载一个脚本之行之后才能用,具体可以参照这篇文章:http://blog.csdn.net/luoshengyang/article/details/6566662
Re: lqxandroid2012 2012-07-10 20:15发表 [回复]
回复Luoshengyang:搞定了,没注意楼主的文章的精髓啊。 我linux 菜鸟来的。
所以开始 少了个. 也没报错,但是就是不行,O(∩_∩)O哈哈~
楼主你差不多可以整理书籍了,北航的编辑应该会主动找你的。
25楼 yang5856 2012-02-25 15:58发表 [回复]
楼主你好,mmm ./externel/hello/输出如下

make: Entering directory `/home/Android-Prj'
make: *** No rule to make target `out/target/product/generic/system/lib/libc.so', needed by `out/target/product/generic/system/bin/hello'. Stop.

请问是什么原因,网上也没有搜到这个问题 解决方法。
24楼 sulen1943 2012-02-21 10:20发表 [回复]
罗老师好,请教您一个问题,Android从2.3开始在源码中放入了NFC芯片的驱动,但是大部分手机厂商编译ROM的时候会把这部分代码裁减掉,请问可不可以自己把这部分代码制作成一个软件包安装入系统内核让其实现对NFC芯片的驱动?(没有手机ROM的源码)我想先确定可行性,可行的话就试试
23楼 tcytree 2011-12-21 12:50发表 [回复]
楼主:
在源代码\frameworks\base\cmds下有很多类似你这样的程序,并且也有用java写的,我怎么能在里
面写一个类似android的apk的程序,比如,我想写个闹钟,IAlarmManager iAlarmManager = IAlarmManager.Stub.asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
AlarmManager alarmManager = new AlarmManager(iAlarmManager);
但下一步启动闹钟我就没有办法了,无法创建
PendingIntent ,建立它需要context实例,怎么能够在这样的方式下获得一个context实例?请楼主指点.
模仿pm(那有pm的源代码)的代码,写一个android的程序,有可能吗?

Re: 罗升阳 2011-12-22 11:48发表 [回复]
回复tcytree:写个闹钟程序为什么要模仿pm来写呢?太下血本了吧:)
22楼 hongnan006 2011-12-17 14:57发表 [回复]
没看过kernel的代码。。。上一篇没看懂。。。
不过楼主写的真的很好,赞一个。。。。
21楼 最后一个菜鸟 2011-12-12 10:55发表 [回复]
引用“Luoshengyang”的评论:回复Sencha_Android:仔细检查一下程序的语法错误。

确实是语法问题
Re: jianggest 2012-03-01 16:55发表 [回复]
回复Sencha_Android:是代码里的语法错误还是.mk的错误啊?我将代码缩短为就一个main了还是不行#include <stdio.h>
//#include <stdlib.h>
//#include <fcntl.h>
//#define DEVICE_NAME "/dev/hello"

int main(int argc, char* argv[])
{
return 0;
}
20楼 最后一个菜鸟 2011-12-09 10:25发表 [回复]
out/target/product/generic/obj/lib/crtbegin_dynamic.o:(.text+0x14): error: undefined reference to 'main'
编译出现此结果,是什么原因?
Re: 罗升阳 2011-12-10 19:28发表 [回复]
回复Sencha_Android:仔细检查一下程序的语法错误。
19楼 floweriswho 2011-11-16 23:34发表 [回复]
亲 写的 真不错 ! 真想给你一个 好评阿!
只能顶了!
18楼 ytllei 2011-11-12 16:25发表 [回复]
楼主你好,我在执行mmm ./external/hello的时候,出现以下错误,怎么解决?
make:进入目录'/opt/android/sources/android-sdk-2'
target thumb C: hello <= external/hello/hello.c
external/hello/hello.c: In function 'main':
external/hello/hello.c:18: error: expected ';' before 'read'
make: *** [out/target/product/generic/obj/EXECUTABLES/hello_intermediates/hello.o] 错误 1
Re: 罗升阳 2011-11-12 17:21发表 [回复]
回复ytllei:这个看起来是程序的语法错误了,自己仔细检查一下就可以了
17楼 yongwong 2011-11-08 16:19发表 [回复]
make: *** No rule to make target `out/target/product/generic/system/lib/libc.so', needed by `out/target/product/generic/system/bin/hello'. Stop.
在输出这个信息的前面还有一些google提示的信息。只要在Android.mk中按照提示加入提示内容就可以编译通过了。其实那些英文提示也不复杂。
Re: 罗升阳 2011-11-08 21:25发表 [回复]
回复yongwong:提示的信息是什么?可不可以贴出来看看。
16楼 yuyan19850204 2011-11-04 20:31发表 [回复]
楼主你好,我编译这个部分出现个错误,麻烦帮忙看下
最好能够加下QQ啊 谢谢 253815347
yuyan@yuyan-desktop:~/csst/gingerbread_v1.28$ mmm ./external/hello/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.1
TARGET_PRODUCT=CSD218
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GINGERBREAD
============================================
make:进入目录'/home/yuyan/csst/gingerbread_v1.28'
make: *** 没有规则可以创建ut/target/product/CSD218/symbols/system/bin/hello需要的目标out/host/linux-x86/bin/acp停止
make:离开目录home/yuyan/csst/gingerbread_v1.28鈥?
yuyan@yuyan-desktop:~/csst/gingerbread_v1.28$
Re: 罗升阳 2011-11-05 12:34发表 [回复]
回复yuyan19850204:设置一下环境变量export TARGET_PRODUCT=CSD218试试看
15楼 lifewind 2011-10-12 15:25发表 [回复]
楼主你好,根据你的流程,我写了个程序也编译成功了,不过总是帮我生成到symbols/system/bin目录下面,而不是直接的system/bin目录下,看了上面其他人的提问,也试了先make clean,后再编译,还是一样?能否请教一下这个是什么原因啊?
Re: 罗升阳 2011-10-12 20:56发表 [回复]
回复lifewind:检查一下Android.mk文件吧,再不行就设置一下环境变量export TARGET_PRODUCT=XXX,XXX默认为generic,把它指定为你要输出的目录
Re: lifewind 2011-10-13 09:23发表 [回复]
回复Luoshengyang:哦,我试过改成generic,能生成到system/bin下;后来查了一下,估计可能还是mmm的问题,改用make [模块名],就好了;谢谢楼主,不过有没有办法可以把C的执行程序含进去,在系统make的时候一起编译,我找了很多地方,也没发现
14楼 Anotherzhou 2011-10-11 17:56发表 [回复]
还有,make snod 后system.img文件有380M,内存溢出,还是直接用make解决掉了。:-)
Re: 罗升阳 2011-10-11 23:23发表 [回复]
回复Anotherzhou:没有这么大吧,我的只有80M+
Re: Anotherzhou 2011-10-12 10:10发表 [回复]
回复Luoshengyang:我也不清楚,我用的是android2.3.3的源代码。后来上网看了make anod的介绍,才知道说这样产生的系统文件不稳定。换成make编译后就好了。总之,谢谢楼主的详细讲解啊,很给力啊!
13楼 Anotherzhou 2011-10-11 17:53发表 [回复]
mmm模块化编译出现的问题太多了,直接make的话,时间又不长,问题又不多。之前那些generic下出现的问题都没有了。谢谢楼主的分享。
12楼 simon1206 2011-09-21 21:49发表 [回复]
如三楼的问题,最后的结果确实是这样的,但能否修改默认的路径不?关键是我在编译你上两篇模块编译举的例子EMAIL,确实能模块编译通过。
Re: 罗升阳 2011-09-22 01:40发表 [回复]
回复simon1206:修改默认的路径指的是?
Re: simon1206 2011-09-22 22:59发表 [回复]
回复Luoshengyang:我的意思是说让编译模块的时候默认的输出是由自己指定,即product的目录下可不再generic输出,可以任意指定。正如3楼的问题,本来用tapas指令,已经指定输出是utc100(假定),不是默认的generic,但是在mmm编译模块的时候指令还是指向了generic目录。
Re: 罗升阳 2011-09-22 23:52发表 [回复]
回复simon1206:export TARGET_PRODUCT=XXX,XXX默认为generic,把它指定为你要输出的目录
11楼 大只辉 2011-09-14 09:29发表 [回复]
4、还想请问博主,有没有其他的方法在android系统下测试硬件驱动的方法。亦或者直接在使用linux内核的根目录进行测试程序的编译。如果不使用android根目录下的bionic目录的c库文件行吗?或者有什么其他更好的方法进行c测试程序的编译或者测试。
Re: 罗升阳 2011-09-14 21:16发表 [回复]
回复linhui568:可以参考一下《在Ubuntu上为Android系统编写Linux内核驱动程序》这篇文章,你可以在proc文件系统或者devfs文件系统把你的设备文件暴露出来让用户空间访问,在设备文件目录/dev下暴露出来也可以,然后通过cat命令就可以读写驱动模块的数据了
10楼 大只辉 2011-09-14 09:23发表 [回复]
3、出错的警告:
root@ubuntu:/home/myandroid# mmm external/watchdog/
…………此处省略400字…………
No private recovery resources for TARGET_DEVICE generic
make: Entering directory `/home/myandroid'
target thumb C: wtd-d901 <= external/watchdog/wtd-d901.c
external/watchdog/wtd-d901.c:10:22: error: watchdog.h: No such file or directory
external/watchdog/wtd-d901.c: In function 'main':
external/watchdog/wtd-d901.c:39: error: 'WDIOC_SETTIMEOUT' undeclared (first use in this function)
external/watchdog/wtd-d901.c:39: error: (Each undeclared identifier is reported only once
external/watchdog/wtd-d901.c:39: error: for each function it appears in.)
external/watchdog/wtd-d901.c:50: error: 'WDIOC_KEEPALIVE' undeclared (first use in this function)
make: *** [out/target/product/generic/obj/EXECUTABLES/wtd-d901_intermediates/wtd-d901.o] Error 1
make: Leaving directory `/home/myandroid'
root@ubuntu:/home/myandroid#
9楼 大只辉 2011-09-14 09:20发表 [回复]
最近在测试imx51的watchdog驱动,出现了一下问题:
1、watchdog测试程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
int main(int argc, char *argv[])
{
…………此处省略500字……
ret = ioctl(fd,WDIOC_KEEPALIVE,0);
printf("ret %d\n",ret);
…………
printf("service ok\n");
sleep(sleepval);
…………
}
2、使用mmm命令的时候发现没有找到watchdog.h的头文件
我使用的Android.mk为
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := wtd-d901
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
同时我查找了android根目录下所有的watchdog.h的目录:
root@ubuntu:/home/android# find -name watchdog.h
./kernel_imx/include/config/watchdog.h
./kernel_imx/include/config/mxc/watchdog.h
./kernel_imx/include/linux/watchdog.h
./kernel_imx/arch/sparc/include/asm/watchdog.h
./kernel_imx/arch/sh/include/cpu-sh4/cpu/watchdog.h
./kernel_imx/arch/sh/include/asm/watchdog.h
./external/qemu/hw/watchdog.h
Re: 罗升阳 2011-09-14 21:11发表 [回复]
回复linhui568:尝试一下在你的Android.mk文件里面定义一下LOCAL_INCLUDES变量,把你要用到的头文件包含进去,可以参考一下hardware/libhardware目录下的Android.mk文件。
8楼 wantianpei 2011-09-07 18:47发表 [回复]
楼主问你一个makefile的问题:
hardware\tegra\hal\libnvomxmediaplayer\OMXPlayer.cpp
hardware\tegra\core\include\Nvdispmgr.h

上面的C++文件怎么调用下面路径的.h文件?
应该是要修改Android.mk文件吧?怎么修改实现呢?
Re: 罗升阳 2011-09-08 00:16发表 [回复]
回复wantianpei:没试过......不过你可以试一下在Android.mk文件里面指定LOCAL_INCLUDES变量看看,hardware/libhardware目录下的Android.mk文件就是指定了LOCAL_INCLUDES变量,可以参考一下
Re: wantianpei 2011-09-08 10:14发表 [回复]
回复Luoshengyang:谢谢楼主提醒.
7楼 wantianpei 2011-08-19 13:17发表 [回复]
写的非常好.
看了后思路清晰很多.
6楼 hui05504 2011-08-03 15:40发表 [回复]
fd = open(DEVICE_NAME, O_RDWR);
楼主,这个语句怎么会和内核hello设备驱动的open关联起来的呢?难道是上一篇文章中hello目录下的Kconfig定义了hello设备模块 /dev/hello,通过这个来关联的?
5楼 大只辉 2011-08-01 10:34发表 [回复]
同时我发现在/out/target/product/generic/symbols/system/lib/目录下有libc.so,是不是路径错了,如果是路径错了,我应该修改那个文件呢?以后编译其他的路径的文件时,是不是都是一样会出现错误呢?
Re: navycsu 2011-08-01 23:49发表 [回复]
回复linhui568:哥们,问题解决了没?
Re: 罗升阳 2011-08-01 12:20发表 [回复]
回复linhui568:参与一下@hui05504这个兄弟遇到的情况:
1.
楼主,按照你上面的教程,出现了以下错误,
No rule to make target `out/target/product/generic/obj/lib/libhardware.so', needed by `out/target/product/generic/obj/SHARED_LIBRARIES/libandroid_servers_intermediates/LINKED/libandroid_servers.so'. Stop.
,麻烦指导下,谢谢
2.
不好意思,这个错误的出错原因估计是在out/target/product/generic/这个目录下,因为我编译源码的时候不是在generic里生成的,而是在新建的目录底下生成,但是这个命令确默认是在generic的路径,所以出错了
Re: 大只辉 2011-08-01 14:14发表 [回复]
回复Luoshengyang:问题已经解决,就是将/out/target/product/generic/symbols/目录下的system目录整个拷贝到/out/target/product/generic/目录下就行了。再make一次。mmm命令和make snod命令编译都不会出错。
Re: wantianpei 2011-09-07 00:17发表 [回复]
回复linhui568:你这样编译system会有问题,虽然依然可以运行起来,但我试着用你那种方法这里提示内存溢出,明显生成的system是有坏区的。
out里面的目录都是make后才产生的,make clean后就没有了。所以说system只能make让它自动产生,不能说自己从别处拷贝过来。
这个问题只需要在 mmm 之前重新make一下就可以了。以后无论是make,还是mmm,还是make clen再make都是没有问题的。
Re: navycsu 2011-08-02 00:10发表 [回复]
回复linhui568:我的问题是:
No rule to make target `out/target/product/generic/obj/lib/crtbegin_dynamic.o', needed by `out/target/product/generic/obj/EXECUTABLES/hello_intermediates/LINKED/hello'. Stop
但是我找不到crtbegin_dynamic.o这个文件啊,我用的是友善之比tiny6410提供的2.3Android源码....
4楼 大只辉 2011-08-01 10:24发表 [回复]
楼主,我在编译$mmm ./externel/hello的时候出现了一下错误,不知为何?
root@ubuntu:/home/Android# mmm ./external/hello/
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=3.1.4.1.5.9.2.6.5
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
============================================
make: Entering directory `/home/Android'
make: *** No rule to make target `out/target/product/generic/system/lib/libc.so', needed by `out/target/product/generic/system/bin/hello'. Stop.
make: Leaving directory `/home/Android'
root@ubuntu:/home/Android#
3楼 navycsu 2011-07-28 23:09发表 [回复]
楼主你好,按照你的步骤,走到mmm ./external/hello的时候出现以下错误:

No rule to make target `out/target/product/generic/obj/lib/crtbegin_dynamic.o', needed by `out/target/product/generic/obj/EXECUTABLES/hello_intermediates/LINKED/hello'. Stop.

请问该如何解决呢?谢谢....
Re: 罗升阳 2011-07-28 23:35发表 [回复]
回复navycsu:是不是没定义好Android.mk文件?
Re: navycsu 2011-07-28 23:39发表 [回复]
回复Luoshengyang:我的mk文件是按照您在文中所讲写的。按照错误提示的意思,好像是说找不到这个文件:out/target/product/generic/obj/EXECUTABLES/hello_intermediates/LINKED/hello'
我看了下,确实没有这个文件,我的文件系统是友善之比tiny6410编译过的文件系统,确实没这个路径...请问楼主知道这个hello文件在哪呢?我手动创建这个目录试试看...
Re: 罗升阳 2011-07-28 23:44发表 [回复]
回复navycsu:你参考一下@hui05504这个哥们的情况:
1.
楼主,按照你上面的教程,出现了以下错误,
No rule to make target `out/target/product/generic/obj/lib/libhardware.so', needed by `out/target/product/generic/obj/SHARED_LIBRARIES/libandroid_servers_intermediates/LINKED/libandroid_servers.so'. Stop.
,麻烦指导下,谢谢
2.
不好意思,这个错误的出错原因估计是在out/target/product/generic/这个目录下,因为我编译源码的时候不是在generic里生成的,而是在新建的目录底下生成,但是这个命令确默认是在generic的路径,所以出错了
Re: caoyiustc 2011-12-07 17:04发表 [回复]
回复Luoshengyang:请问这个问题应该怎么改呢?的编译的生成路径是out/target/product/crespo,我应该怎样修改呢?麻烦楼主,楼主辛苦了。
Re: 罗升阳 2011-12-08 21:44发表 [回复]
回复caoyiustc:设置一下环境变量TARGET_PRODUCT=crespo看看。
2楼 navycsu 2011-07-28 22:40发表 [回复]
很少能看到像楼主这样系统、全面、细致的讲解。对于我们初学者来说,帮助太大了,真的太感谢了!
1楼 hui05504 2011-07-27 16:40发表 [回复]
楼主辛苦了:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值