转载请注明出处,作者: K_Linux_Man
一.将linux-2.6.29内核镜像zImage从tftp上启动. 放到/tftpboot 目录下
二.制作Android根文件系统,让开发板从NFS启动。(S5PC100-A光盘里有文档说明)
1、拷贝“Linux-Android\源码”目录下的“eclair_2.1_farsight.tar.gz”到目标目录下,然后解压
tar zxvf eclair_2.1_farsight.tar.gz
2、Android_2.1编译
初始化Android构建子系统(导出几个命令到环境变量):
~/eclair_2.1_farsight/$ . ./build/envsetup.sh
注意这里两个’.’ 之间有一个空格,第一个’.’指定用当前shell解析这个脚本,否则不能执行。
配置板级信息:
~/eclair_2.1_farsight/$ tapas
tapas就是上一步执行结束之后导出到环境变量里的命令,专门用来配置板级信息的。
具体配置选项如下:
Build for the simulator or the device?
1. Device
2. Simulator
Which would you like? [1] 1
Build type choices are:
1. release
2. debug
Which would you like? [1] 1
Which product would you like? [fs100] fs100
Variant choices are:
1. user
2. userdebug
3. eng
Which would you like? [eng] eng
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=fs_s5pc100
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID= ERE27
开始编译(如果不能找到mm,执行”source build/envsetup.sh”):
~/eclair_2.1_farsight/$ mm
系统会自动生成相关的文件系统镜像 “out/target/product/fs100/”, 可以在这里找到各个部分。
3、制作yaffs2文件系统镜像
执行:
~/eclair_2.1_farsight/$ ./make_fs100_yaffs2_image.sh
就会在Android源码根目录下生成目录“fs100_root”,这个目录就是编译生成的Android文件系统,调试时可以直接把这个目录作为NFS-Server的目录。还会生成一个“fs100_root.img”文件,这个文件就是Android的yaffs2格式的镜像,可以使用dnw工具将这个镜像烧写到Nand Flash上。
Android源码根目录下的fs100_root就是咱们已经做好的根文件系统。把他拷贝到/source
并且改名为rootfs
三.设置uboot的启动参数:
需要注意的是nfsroot后面的ip地址是你虚拟机的ip。板子的ip地址是192.168.1.180。把ipaddr改成板子的ip,serverip改成虚拟机的ip。
四.显示Android界面:
首先得运行起来Android界面,这样以后才能开发Android驱动。
五.在Eclipse中编写framework
主要编写beepService.java和ledService.java
编写这两个service主要是加载jni生成的库。Libxx.runtime.so
下面是ledservice的模板:
import android.util.Log;
public class ledService {
static {
Log.i("ledService", "Load Native service LIB");
System.loadLibrary("led_runtime");
}
public ledService() {
Log.i ( "Java Service" , "do init Native Call" );
_init ();
}
public boolean set_on(int arg) {
if(0 == _set_on(arg)) {
return true;
}else {
return false;
}
}
public boolean set_off(int arg) {
if(0 == _set_off(arg)) {
return true;
}else {
return false;
}
}
private static native boolean _init();
private static native int _set_on(int arg);
private static native int _set_off(int arg);
}
需要注意的是_init() _set_on(int arg) _set_off(int arg) 三个函数的实现是在jni层实现的,在jni层里实现java与c/c++ 函数的一一对应。
六.编译
Jni代码的实现其实很简单,Stub的实现都有框架结构。这个我再单独写个博文。。
需要注意的点:
Jni文件的名字要与eclipse下包的路径一致,对于java包中的. 换成_
比如我的framework文件在 com.farsight.server.ledService.java 对应我的jni文件名是com_farsight_server_ledService.java
编译的时候通常会出错误:
原因第一是你没有把工程放在Android源码根目录下,第二就是没有加载环境变量
加载的方法:
. android源码目录下/build/envsetup.sh (第一个点是Android.mk的路径,也就是说我是在当前目录下有Android.mk才编译的,第二个参数是路径,加载环境变量的shell程序) 执行完这句话后,再执行mm (注意要写切换到root用户下)
六:编译后步骤:
把stub生成的led.default.so 放到根文件系统下的/source/rootfs/system/lib/hw下
把jni生成的libled.runtime.so放到根文件系统下的/source/rootfs/system/lib下
将eclipse程序打包成apk。拷贝到/source/rootfs/system/app下。
将linux驱动全部拷到根文件系统下,然后insmod驱动。
运行应用程序。测试Android驱动程序。
七:ADB USB 真机调试(具体没有实现,但是知道可以,把Mini6410ADB的步骤截图列出来了,大家可以尝试一下)