硬件平台:S3c6410
操作系统:ubuntu 虚拟机virtualbox
板子系统:Android
开发工具:jdk,ndk,eclipse
jdk资源:
http://115.com/?ct=rar&pickcode=bntc6d7l5q2d88bx
6410板子系统Android2.3的内核源码、文件系统以及uboot在资源里提供:
内核源码:http://115.com/?ct=rar&pickcode=djrspmqbpoktxx4f
文件系统:http://115.com/?ct=rar&pickcode=djrc7j0806z0xx4f
uboot:http://119.147.150.59/gdown_group293/M00/16/20/d5OWO1BftgIAAAAAAAMAAEHxxSk9244690/u-boot.bin?k=8D7DLqf_BBOdra-11ChrbQ&t=1378704835&u=3736210167-305963772-bntakp90q5p188bx&s=307200&file=u-boot.bin
Android底层驱动测试时是在熟悉linux驱动实现过程的基础上进行的,如果没有linux驱动的经验,建议先从linux内核驱动开始学起。以前的文章中提到了将驱动编译进内核,虽然是增大了内核的体积,但平时做实验时较为方便,所以在编译zImage时将leds设备编译进了内核。
现在就要开始写测试程序了。JNI是Java Native Interface的缩写,中文为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互。写测试程序时使用JNI方式实现。
eclipse建立一个新应用程序。名字为gpio,包名为com.example.gpio
Activity名为GpioActivity
打开java文件,添加public static native int gpio_ioctl(int i, int j);为生成jni头文件做准备。
编译android项目,将其转移到ubuntu上面。
在工程文件gpio目录下
创建jni文件夹:
mkdir jni
利用javah命令生成jni头文件:
javah -classpath bin/classes -d jni com.example.gpio.GpioActivity
如果出现错误,则尝试下面的方法:
javah -classpath /mnt/shared/android.jar:/home/user/Desktop/gpio/bin/classes com.example.gpio.GpioActivity
冒号后没有空格
/mnt/shared/是存放android.jar的路径。
如果没有出错,就会生成 com_example_gpio_GpioActivity.h的头文件。
创建gpio.c
#include <jni.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <android/log.h> #define LOG_TAG "LED" //android logcat #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__ ) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS_ _) //int main(int argc, char **argv) jint JNICALL Java_com_example_gpio_GpioActivity_(此处的函数名字一定要和jni头文件里的函数名字一致)(JNIEnv *env, jclass thiz, jint led_nu, jint on) { int fd; fd = open("/dev/leds", O_RDWR); if(fd < 0) printf("Can't open /dev/leds!\n"); ioctl(fd, on, led_nu); close(fd); return 0; }
jni目录下编写Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Gpio_ctrl LOCAL_SRC_FILES := gpio.c LOCAL_LDLIBS := -llog LOCAL_C_INCLUDES := $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics \ $(MY_ANDROID_SOURCE)/external/skia/include/core \ $(MY_ANDROID_SOURCE)/external/skia/include/images \ $(MY_ANDROID_SOURCE)/frameworks/base/include \ $(MY_ANDROID_SOURCE)/system/core/include include $(BUILD_SHARED_LIBRARY)
将gpio.c编译成.so文件
nkd-build
在libs/armeabi/会生成libGpio_ctrl.so文件。
将.so文件放到eclipse工程目录/libs/armeabi下,java语言编写测试程序。
程序里使用gpio_ioctl即是对arm芯片的gpio的操作,使开发平台上的小灯开关,或是闪烁。
编译生成apk后安装,完成对小灯的控制。
控制终端安装apk命令 pm install -f xxx.apk
卸载命令 pm uninstall -f xxx.apk