今天加班的时候,完成了jni直接调用驱动的开发,这一篇是接着系列<3>后面的.
由于前面完成Android的HAL层开发,接着继续往上就是frameworks层,那么所写的程序就要在framework下面,步骤如下:
<1> 进入系统下的frameworks目录:
cd frameworks/base/services/jni
<2> 在上面的路径下添加:在这目录下,有很多这样的文件,也可以仿照写.
vim com_android_server_HelloService.cpp
<3> : 在系列<3> 上的基础上开发上面的*.cpp程序:在程序上来说,是个jni(NDK)开发
#include "jni.h"#include "JNIHelp.h"#include "android_runtime/AndroidRuntime.h"#include#include #include #include #include namespace android{ struct callleds_device_t* callleds_device=NULL; static void callleds_setLed(JNIEnv* env,jobject clazz,jint value){ int val=value; if(!callleds_device){ return ; } callleds_device->set_led(callleds_device,val); } static inline int callleds_device_open(const hw_module_t* module,struct callleds_device_t** device){ return module->methods->open(module,CALLLEDS_HARDWARE_MODULE_ID,(struct hw_device_t**)device); } static jboolean callleds_init(JNIEnv* env,jclass clazz){ callleds_module_t* module; if(hw_get_module(CALLLEDS_HARDWARE_MODULE_ID,(const struct hw_module_t**)&module)==0){ if(callleds_device_open(&(module->common),&callleds_device)==0){ return 0; } return -1; } return -1; } static const JNINativeMethod method_table[]={ { "init_native","()Z",(void*)callleds_init }, { "setLed_native","(I)V",(void*)callleds_setLed }, }; int register_android_server_CallledsService(JNIEnv *env){ return jniRegisterNativeMethods(env,"com/android/server/CallledsService",method_table,sizeof(method_table)/sizeof(method_table[0])); }};
<5> : 如果不出意外,生成结果如下 :
<6> : vim两个操作:
<a> : zz保存退出;
<b> : 撤销上一步操作;