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 == )
{
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(); return ;
} jint off_led_jni(JNIEnv *Env, jobject thiz)
{
ALOGD("--%s--", __func__);
if(pDevice != NULL)
pDevice->control(); return ;
} jint close_led_jni(JNIEnv *Env, jobject thiz)
{
ALOGD("--%s--", __func__);
if(pDevice != NULL)
{
pDevice->common.close((struct hw_device_t*)pDevice);
} return ;
} //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 != )
{
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 < )
{
ALOGE("RegisterNatives error");
return -;
} 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)