• Android 从上层到底层-----jni层


    CPU:RK3288

    系统:Android 5.1

    功能:上层 app 控制 led 亮灭

    开发板:Firefly RK3288

    led_jni.h

    path:hardware/rockchip/firefly/led_jni/led_jni.cpp

    #include "jni.h"
    #include <hardware/led_hal.h>
    
    #define LOG_TAG    "led_jni"
    #include <utils/Log.h>
    
    #define ARRAY_SIZE(arr)    (sizeof(arr)/sizeof(arr[0]))
    
    struct led_hw_module_t *pModule = NULL;
    struct led_hw_device_t *pDevice = NULL;
    
    
    void open_led_jni(JNIEnv *Env, jobject thiz)
    {
        ALOGD("--%s--", __func__);
        jint ret;
        
        //加载hal的so, 得到module对象
        //参数1--hal的so的名字
        //参数2--指定hal中module对象指针
        //成功之后,pModule被初始化
        ret = hw_get_module(LED_HAL_MODULE_ID, (const struct hw_module_t **)&pModule);
        if(ret == 0)
        {
            ALOGD("hw_get_module ok");
        
            //调用module对象中open方法,得到device对象
            //p->common.methods->open()
            //参数1--当前已经被初始化module对象
            //参数2--区分不同的device的标识符,一般直接填NULL
            //参数3--指向hal中device对象的指针
            pModule->common.methods->open(&pModule->common, NULL, (struct hw_device_t **)&pDevice);
            
                    //调用devive中方法
            if(pDevice != NULL)
                pDevice->open();
        }
        else
        {
            ALOGD("hw_get_module failed");
            return;
        }
    }
    
    jint on_led_jni(JNIEnv *Env, jobject thiz)
    {
        ALOGD("--%s--", __func__);
        if(pDevice != NULL)
            pDevice->control(1);
        
        return 0;
    }
    
    jint off_led_jni(JNIEnv *Env, jobject thiz)
    {
        ALOGD("--%s--", __func__);
        if(pDevice != NULL)
            pDevice->control(0);
        
        return 0;
    }
    
    jint close_led_jni(JNIEnv *Env, jobject thiz)
    {
        ALOGD("--%s--", __func__);
        if(pDevice != NULL)
        {
            pDevice->common.close((struct hw_device_t*)pDevice);
        }
    
        return 0;
    }
    
    //jni层与app层方法的对应关系
    //()中为参数类型,()后面为返回值类型
    static JNINativeMethod led_native_methods[] = {
        {"openDev", "()V", (void *)open_led_jni},
        {"onDev", "()I", (void *)on_led_jni},
        {"offDev", "()I", (void *)off_led_jni},
        {"closeDev", "()I", (void *)close_led_jni},
    };
    
    //JNI_OnLoad 返回值--正确返回JNI_VERSION_1_4, 错误返回负数
    jint JNI_OnLoad(JavaVM *vm, void *reserved)
    {
        ALOGE("--%s--", __func__);
        
        jint ret;
        //环境变量对象--提供jni中各种操作方法
        JNIEnv *env = NULL;
        
        //获取当前线程的Java运行环境
        //参数1--被初始化的环境变量对象
        //参数2--jni版本
        //返回值--正确为0, 错误负数
        ret = vm->GetEnv((void **)&env, JNI_VERSION_1_4);
        if(ret != 0)
        {
            ALOGE("GetEnv error");
            return ret;
        }
        
        //获取到java本地方法所在的类,包名。类名,大小写必须与上层一致
        jclass clz = env->FindClass("com/aaron/link/LedNative");
        if(clz == NULL)
        {
            ALOGE("FindClass error");
            return ret;
        }
        
        //注册映射表给dvm
        //参数1--java本地方法对应类信息
        //参数2--映射表
        //参数3--映射表项目个数
        //返回值--出错小于0
        ret = env->RegisterNatives(clz, led_native_methods, ARRAY_SIZE(led_native_methods));
        if(ret < 0)
        {
            ALOGE("RegisterNatives error");
            return -1;
        }
        
        return JNI_VERSION_1_4;
    }

    Android.mk

    path:hardware/rockchip/firefly/led_jni/Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_MODULE := libfirefly_led_jni
    
    LOCAL_SRC_FILES := led_jni.cpp
    
    LOCAL_SHARED_LIBRARIES := libcutils 
                    libhardware
                    
    LOCAL_C_INCLUDES += 
            $(JNI_H_INCLUDE) 
            $(LOCAL_PATH)/../led_hal/
            
    include $(BUILD_SHARED_LIBRARY)

    Android 从上层到底层-----kernel层

    Android 从上层到底层-----hal层

    Android 从上层到底层-----app层

  • 相关阅读:
    正方形_自适应_移动端
    meta name="viewport" content="width=device-width,initial-scale=1.0"
    :before/:after与::before/::after的区别 和属性content:值
    布局:flex弹性布局_兼容性写法
    布局:文本多列布局 column-* :
    布局:网格布局
    clear
    布局:盒模型 box-sizing : border-box ;
    object-fit : cover; 对象(图片和视频对象)
    布局:flex弹性布局_实践02
  • 原文地址:https://www.cnblogs.com/lialong1st/p/8868149.html
Copyright © 2020-2023  润新知