1、编写GPIO驱动并编译为模块
完全按照linux驱动的编写方式,封装为标准的linux字符驱动

2、使用C语言编写测试程序
编写、编译一个操作led的程序进行驱动测试
以上两步可参考《s5pv210-gpio》:
s5pv210-gpio.c
s5pv210-gpio.h
s5pv210-gpio_test.c
其编译必须在linux环境下完成,交叉编译测试程序时使用静态编译

3、在eclipose中设计java接口
在eclipose中新建一个android工程用于设计底层jni的操作接口(windows、linux均可)
可参考《s5pv210-gpio》:
s5pv210-gpio\src\com\edu\gpio\s5pv210_gpio_options.java

4、由javah 生成.h文件
我们最终的目的是要实现s5pv210_gpio_options.java中设计的接口

由jdk自带的javah组件生成s5pv210_gpio_options.h文件
打开终端,进入刚才编译的Java程序的目标文件夹(如果是在Eclipse中,则进入工程的bins\classes目录),执行下面的命令:
javah com.edu.gpio.s5pv210_gpio_options
其中,com.edu.gpio.是package的名字,s5pv210_gpio_options是声明了native接口的Java类。
之后,将会生成一个形如com_edu_gpio_s5pv210_gpio_options.h的头文件。
此头文件中便声明了可以被Java调用的C/C++的函数形式。

5、由.h文件设计.c文件接口
自己根据s5pv210_gpio_options.h构建相应的.c文件
复制一个跟s5pv210_gpio_options.h同名的.c文件,将里面的声明全部改为对应的实现
可参考:s5pv210_gpio_options.c
注意java中数据类型与c语言数据类型之间的转换规则
设计.c文件的实现时可参考第2步的测试程序设计

7、编写makefile文件
C程序编写完毕后,在文件夹中创建一个名为Android.mk的文件,文件名不能修改,内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=com_sapp_gpio.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_MODULE := libgpio
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_MODULE_TAGS := eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY) 

其中,LOCAL_SRC_FILES后面的文件是我们的C语言的源程序文件名
LOCAL_MODULE后面的名字是我们将来生成的目标文件名
include $(BUILD_SHARED_LIBRARY)表示将来要生成动态链接库。

OK,写好之后,回到Android源码的根目录,执行:
在android源码目录的external下建立libs5pv210-gpio文件夹
将com_edu_gpio_s5pv210_gpio_options.c
com_edu_gpio_s5pv210_gpio_options.h
Android.mk
libs5pv210-gpio.so
拷到此目录下

回到android源码根目录,执行以下命令make libgpio
其中,libgpio是我们的Android.mk文件中LOCAL_MODULE的名字。
等待编译结束,在out/target/product/generic/system/lib/libgpio.so目录下即可找到编译好的文件。

8、将动态库拷入根文件系统/system/lib文件



9、编写测试程序,下载到开发板中使用