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層


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM