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)