android sensor 驱动以及app 的应用:是kernel到app的逐层封装
1. kernel中队硬件的操作,hardware 对kernel封装,jni 将hardware转换为java的接口
hardware部分
./libhardware/include/hardware/sensors.h
./telechips/tcc92xx/module/sensors/sensors.c
jni部分
frameworks/base/core/jni/android_hardware_SensorManager.cpp
java的实现部分
frameworks/base/core/java/android/hardware
2. framework部分给应用部分提供所需要的so,jni 主要通过JNINativeMethod实现
typedef struct{
const char* name; /*JNI函数的名称*/
const char* signature;/*描述JNI函数的参数和返回值*/
void* fnPtr ;/*JNI对应的C语言的函数指针*/
};
在使用JNI,需要注意JNI函数的参数和返回值的类型,在JAVA中,定义函数由JNI实现时,需要指定为 native,并且使用参数和返回值与JNI中定义相一致。
比如:在JNI中声明JAVA 与 C 的关系;
static JNINativeMethod gMethods[] = {
{"nativeClassInit","()V", (void*)nativeClassInit},
{"sensors_module_init","()I", (void*)sensors_modules_init},
{"sensors_module_get_next_sensor","Landroid/hardware/Sensor;I", (void*)sensors_data_open}, /*将hardware的data_open 函数进一步封装*/
};
通过 jniRegisterNativeMethods(env,"",gMethods,NELEM(gMethods))注册完成,注册之后还需要获取java环境以及向java中本地方法。
注册的接口:./dalvik/libnativehelper
3. 应用部分
应用部分的程序为*.apk,在应用部分中需要加载JNI的库与调用本地接口
system.loadLibrary("libName")
声明JNI的接口,以及直接将so载入
阅读(921) | 评论(0) | 转发(0) |