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的亮灭,代码如下:
然后在工程的bin/classes目录下在cmd中执行javah -jni org.natives.example.NativeExampleActivity,
就会在根目录下得到一个org_natives_example_NativeExampleActivity.h的文件
然后根据头文件的内容编写org_natives_example_NativeExampleActivity.c文件
之后编译生成so文件如“liborg_natives_example_NativeExampleActivity.so”,名称与System.loadLibrary("org_natives_example_NativeExampleActivity")中的名称一致
Android.mk文件如下:
把编译生成的库.so和之前的驱动.ko文件push到手机,下载应用,led就可以跑起来了。
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就可以跑起来了。
相关文章推荐
- android驱动学习入门-android应用怎么调用驱动
- android驱动学习入门-android应用怎么调用驱动1
- Linux学习:应用层open调用驱动层open过程
- android从应用到驱动之—camera(1)---程序调用流程
- android从应用到驱动之—camera(1)---程序调用流程
- android从应用到驱动之—camera(1)---程序调用流程
- Android学习之调用系统应用打开文件
- android从应用到驱动之—camera(1)---程序调用流程[转]
- android底层驱动学习之从应用程序如何到底层driver的调用
- android从应用到驱动之—camera(1)---程序调用流程
- (转)android从应用到驱动之—camera(1)---程序调用流程
- 2014-10-23android学习----Android应用项目的欢迎activity怎么写?
- android从应用到驱动之—camera(1)---程序调用流程
- Android应用开发中使用Fragment的入门学习教程
- Android 应用层如何调用驱动节点
- Androidx学习笔记(71)--- 需要支付的应用(调用远程的服务)
- android 入门学习笔记 NotificationManager与Notification对象的应用
- android从应用到驱动之—camera(1)---程序调用流程
- Android驱动学习-app调用内核驱动过程(驱动框架回顾)
- android底层驱动学习之 module_init的内核调用顺序