Android 驱动测试程序H-M-S <5>

今天加班的时候,完成了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 <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/callleds.h>
#include <stdio.h>

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]));
    }

};


<4> : 运行,开始build:

 

 

<5> : 如果不出意外,生成结果如下 :

 

 

<6> : vim两个操作:

<a> : zz保存退出;

<b> : 撤销上一步操作;

 

posted @ 2014-05-29 00:37  MMLoveMeMM  阅读(410)  评论(0)    收藏  举报