实现自己的HAL-11 控制led(jni 的编写),从app 到 hal 到底层内核kernel层的驱动 的实现(三)

led 驱动的framwork 的jni 的编写

  • 在文件夹Z:\itop-3399_8.1\frameworks\base\services\core\jni 下创建 com_android_server_HelloWorldService.cpp
  • com_android_server_HelloWorldService.cpp 代码
#include <nativehelper/JNIHelp.h>
#include <jni.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/helloworld.h>
#include <stdio.h>
#include <android_runtime/Log.h>

namespace android {

    struct helloworld_device_t * helloworld_device = NULL;
    int fd = 0;

    static jboolean helloworld_init(JNIEnv* env, jobject clazz){

        helloworld_module_t *module;
        ALOGI("hello jni init");
        if(hw_get_module(HELLOWORLD_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module)== 0){

            ALOGI("hw_get_module success");

            if(module->common.methods->open(&(module->common),HELLOWORLD_HARDWARE_MODULE_ID, (struct hw_device_t **)&helloworld_device) == 0){
                 ALOGI("open success");
                return JNI_TRUE;
            }

            ALOGI("open error");
            return JNI_FALSE;

        }
        ALOGI("hw_get_module error");
        return JNI_FALSE;

    }



    static jboolean led_close(JNIEnv* env, jobject clazz){

        int let = -1;

        if(!helloworld_device){
            ALOGI("hello jni device is not open");
            return JNI_FALSE;
        }

        if(fd>0){
            let = helloworld_device->led_close(helloworld_device, fd);
            ALOGI("led_close let: %d", let);
            if(let>=0){
                return JNI_TRUE;
            }else {
                ALOGI("led_close is error");
                return JNI_FALSE;
            }
        }

        ALOGI("please open led device");
        
        return JNI_FALSE;

    }

    static jboolean let_open(JNIEnv* env, jobject clazz){
        
        int let = -1;

        if(!helloworld_device){
            ALOGI("let_open is error");
            return JNI_FALSE;
        }

        if(fd>0){
            let = helloworld_device->led_open(helloworld_device, fd);
            ALOGI("let_open let: %d", let);
            if(let>=0){
                return JNI_TRUE;
            }else {
                 ALOGI("let_open is error");
                return JNI_FALSE;
            }
           
        }
        
        ALOGI("please open led device");

        return JNI_FALSE;
    }

    static jboolean open_led_device(JNIEnv* env, jobject clazz){
        if(!helloworld_device){
            ALOGI("open_led_device is error");
            return JNI_FALSE;
        }

        fd = helloworld_device->open_led_device(helloworld_device);
        ALOGI("fd is : %d", fd);
        if(fd >0){
            ALOGI("open led device is success");
            return JNI_TRUE;
        }

        ALOGI("open led device is error");

        return JNI_FALSE;
    }

    static jboolean close_led_device(JNIEnv* env, jobject clazz){
        int let = 0;
        if(!helloworld_device){
            ALOGI("close_led_device is error");
            return JNI_FALSE;
        }

        if(fd > 0){
            let = helloworld_device->close_led_device(helloworld_device, fd);
        }

        fd = -1;
        return JNI_TRUE;
    }


    static JNINativeMethod sMethods[] = {
        {"init", "()Z", (void*)helloworld_init},
        {"close_led", "()Z", (void*)led_close},
        {"open_led", "()Z", (void *)let_open},
        {"led_device_open", "()Z", (void *)open_led_device},
        {"led_device_close", "()Z", (void *)close_led_device},
    };

    int request_android_server_HelloWorldService(JNIEnv* env){
        return jniRegisterNativeMethods(env, "com/android/server/HelloWorldService", sMethods, NELEM(sMethods));
    }
}
  • 在Z:\itop-3399_8.1\frameworks\base\services\core\jni 目录下的Android.mk 文件中添加自己的jni 入口
LOCAL_SRC_FILES += \
    ~~~~~
    $(LOCAL_REL_DIR)/com_android_server_GraphicsStatsService.cpp \
    ####add ####################
	$(LOCAL_REL_DIR)/com_android_server_HelloWorldService.cpp \
	####add ####################
    $(LOCAL_REL_DIR)/onload.cpp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值