您的位置:首页 > 移动开发 > Android开发

android驱动学习入门-android应用怎么调用驱动2

2012-04-05 16:10 459 查看
android应用怎么调用驱动的结构层次:

android应用

|

| 通过native实现

|

C/C++代码

|

| 通过open(close、ioctl、write、read)操作设备

|

C设备驱动

从上面可以看得出,上层android应用要调用底层驱动,简单的方式就是,先通过native调用C/C++,再通过open(close、ioctl、write、read)动作,操作驱动,就是那么一个过程。

上一篇文章已经说过:C/C++怎么调用驱动程序/article/8403533.html

下面说一下android应用是怎么通过native调用C/C++代码的,可以将native方法比作Java程序同C程序的接口,其实现步骤:

1、在Java中声明native()方法,然后编译;

2、用javah产生一个.h文件;

3、写一个.c文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);

4、将第三步的.c文件编译成动态链接库文件.SO;

5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

首先创建一个android项目,写一个代码控制这个led的亮灭,代码如下:

public class NativeExampleActivity extends Activity {
TextView textView01;
private Button btnStart;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btnStart = (Button) this.findViewById(R.id.btnStart);
btnStart.setOnClickListener(clickButtonStart);
textView01 = (Button) this.findViewById(R.id.btnStart);

}

private  OnClickListener clickButtonStart = new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//textView01.setText("led state: "+ledFunction(0));
textView01.setText("led state: "+ledFunction(1));
}
};

static {
try {
System.loadLibrary("org_natives_example_NativeExampleActivity");//加载库文件,系统会自动处理成lib***.so
} catch (Throwable t) {
}
}

public native int ledFunction(int a);//native方法,控制led的亮灭
}

然后在工程的bin/classes目录下在cmd中执行javah -jni org.natives.example.NativeExampleActivity,

就会在根目录下得到一个org_natives_example_NativeExampleActivity.h的文件

然后根据头文件的内容编写org_natives_example_NativeExampleActivity.c文件

#include "com_hode_hodeframework_modelupdate_CheckFile.h"
JNIEXPORT jint JNICALL Java_org_natives_example_NativeExampleActivity_ledFunction(JNIEnv *, jobject, jint a)
{
int fd;
int ret;
fd = open("/dev/vib",O_RDWR);//Open device ,get the handle

if(a==0)
ioctl(fd,0x22); //call the output function to on LEDs
else
ioctl(fd,0x11); //call the output function to off LEDs
ret = close(fd); //close device
return a;
}


之后编译生成so文件如“liborg_natives_example_NativeExampleActivity.so”,名称与System.loadLibrary("org_natives_example_NativeExampleActivity")中的名称一致

Android.mk文件如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PRELINK_MODULE := false
LOCAL_MODULE      := liborg_natives_example_NativeExampleActivity
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES   := org_natives_example_NativeExampleActivity.c
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := libutils

include $(BUILD_SHARED_LIBRARY)


把编译生成的库.so和之前的驱动.ko文件push到手机,下载应用,led就可以跑起来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: