Android底层驱动验证过程(S3C6410 gpio)

硬件平台: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

你可能感兴趣的:(Android开发,NDK,应用程序,linux内核,linux驱动)