我想为android构建一个内核模块。 我知道我使用交叉编译。在内核中,我认为我可以使用一些通用的交叉编译,例如arm-none-linux-gnueabi-gcc。我的想法是正确的吗?或者任何其他交叉编译的android,你可以提示我?还有任何关于如何在ubuntu中构建环境以进行交叉编译的技巧? 其次,每当我编译模块时,如何将其作为模块加载到内核中? 最后,有人解释NDK,交叉编译和工具链之间的关系吗? THX
答案 0 :(得分:3)
嗯,这是一个很大的问题,但我会尽量回答我所知道的事情。我相信一个特定的硬件制造商会有一个Android“Bundle”,它将包含一套完整的工作软件。这将包括工具链,Linux内核源代码,u-boot启动程序和整个Android系统。就我而言,飞思卡尔为他们提供的特定处理器和评估板提供了Android软件包。
就术语而言,“交叉编译器”将包含在“工具链”中。术语“工具链”包括整个交叉编译器,交叉库等。每个工具链都是为主机(即Linux,cygwin等)和目标处理器(arm,mips,PowerPC等)构建的。
构建Linux for Android与构建Linux完全没什么不同。建议使用相同的工具链来构建用于构建Android系统其余部分的Linux。要构建Linux,请设置“ARCH = arm”和“CROSS_COMPILE = arm-none-linux-gnueabi-”的环境变量(或者您正在使用的实际交叉编译器的前缀)。注意结尾“ - ”在交叉编译前缀中很重要。
以下链接介绍了如何设置开发环境。
Android Development environment set up.
注意,Ubuntu 10.04到11.04运行良好。建议保持其中一个版本。
将Linux内核置于目标上完全取决于目标。对于我正在使用的飞思卡尔,它期望在偏移0x800块的SD卡上找到Linux内核(每个块在SD卡上为512字节)。我使用以下内容写入SD卡raw:
sudo dd if = uImage of = / dev / sdb bs = 1M seek = 1;同步
就NDK而言,我根本没有经验。我对它的理解是,它是Android Java应用程序的一个接口,可以调用“C”和“CPP”代码来定时关键功能。我不知道的是它对JNI接口的优势,以及它与JNI接口的区别。
我希望你觉得这很有用,也很有用。