代码示例_JNI / HAL

 

 


 

 

 

 1 #ifndef LED_HAL_H__
 2 #define LED_HAL_H__
 3 
 4 #include <hardware/hardware.h>
 5 
 6 //定义HAL层动态库的名称
 7 #define LED_MODULE_ID "s5pv210_led_hal"
 8 
 9 //需要重新定义结构体:module和device
10 
11 //定义module结构体
12 struct led_hw_module_t{
13     //继承父类
14     struct hw_module_t common;        //第一个成员必须是父类,名字必须是:common
15 
16     //以下为自己扩展的成员-----自定义
17     int serial_id;
18     int led_id;
19 };
20 
21 //定义device结构体
22 struct led_hw_device_t{
23     //继承父类
24     struct hw_device_t common;        //第一个成员必须是父类,名字必须是:common
25 
26     //以下为自己扩展的成员-----自定义
27     int (*open_dev)();
28     int (*contrl_dev)(int on);
29 };
30 
31 #endif

 

 

 

 

 


 

 

 

 

 

 

  1 #define LOG_TAG "led_jni_log"
  2 #include <utils/Log.h>
  3 #include "jni.h"
  4 #include "led_hal.h"
  5 
  6 struct led_hw_module_t *pmodule = NULL;
  7 struct led_hw_device_t *pdevice = NULL;
  8 
  9 //3,实现接口函数
 10 static jint open_led(JNIEnv *env, jobject thiz) 
 11 {
 12     jint ret;
 13     LOGI("-----------------^_^ %s---------------\n",__FUNCTION__);
 14     //1,加载hal层中的动态库 ------ 获取hal层中的module对象
 15     //参数1 ---- HAL层中的动态库的名称
 16     //参数2 ---- 指向module对象的指针的地址
 17     //返回值----- 成功---0,失败---负数
 18     ret = hw_get_module(LED_MODULE_ID,(const struct hw_module_t**)&pmodule);
 19     if(ret == 0){   //调用成功---获取到了module对象
 20         LOGI("-----------------hw_get_module OK---------------\n");
 21 
 22         //2,调用module对象中的open函数获取device对象
 23         if(pmodule != NULL){
 24             //参数1 --- hal层module对象的地址
 25             //参数2 --- 区分不同的设备,一般为NULL
 26             //参数3 --- 指向device对象的指针的地址
 27             pmodule->common.methods->open(&pmodule->common,NULL,(struct hw_device_t**)&pdevice);
 28 
 29 
 30             //3,通过device对象调用open方法,打开设备:open_dev
 31             if(pdevice != NULL)
 32                 pdevice->open_dev();
 33 
 34         }
 35 
 36     }else{
 37         LOGI("-----------------hw_get_module error---------------\n");
 38         return -1;
 39     }
 40     
 41 
 42     return 0;
 43 }
 44 
 45 static jint led_on(JNIEnv *env, jobject thiz) 
 46 {
 47     
 48     LOGI("-----------------^_^ %s---------------\n",__FUNCTION__);
 49     if(pdevice != NULL)
 50         pdevice->contrl_dev(1);
 51     return 0;
 52 }
 53 static jint led_off(JNIEnv *env, jobject thiz) 
 54 {
 55     jint ret;
 56     LOGI("-----------------^_^ %s---------------\n",__FUNCTION__);
 57     if(pdevice != NULL)
 58         pdevice->contrl_dev(0);
 59     
 60     return 0;
 61 }
 62 
 63 static jint close_led(JNIEnv *env, jobject thiz) 
 64 {
 65     LOGI("-----------------^_^ %s---------------\n",__FUNCTION__);
 66     if(pdevice != NULL)
 67         pdevice->common.close((struct hw_device_t*)pdevice);
 68     return 0;
 69 }
 70 
 71 
 72 //2,创建映射表
 73 const JNINativeMethod led_jni_methods[] = {
 74     {"openDev", "()I", (void*)open_led},
 75     {"devOn", "()I", (void*)led_on},
 76     {"devOff", "()I", (void*)led_off},
 77     {"closeDev", "()I", (void*)close_led},
 78 };
 79 
 80 //1,实现JNI_Onload函数
 81 jint JNI_OnLoad(JavaVM* vm, void* reserved)
 82 {
 83 
 84     JNIEnv* env = NULL;
 85 
 86     LOGI("-----------------^_^ %s---------------\n",__FUNCTION__);
 87     //1, 获取环境变量对象-----环境变量对象中封装了很多jni编程需要的函数
 88     //参数1 -- 环境变量指针的地址
 89     //参数2 -- jni的版本
 90     //返回值: 成功--0, 失败--负数
 91     if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
 92         LOGE("ERROR: vm->GetEnv failed");
 93         return -1;
 94     }
 95 
 96     //2, 获取应用层app中声明的本地方法所在的类
 97     //参数 ---- app中类的路径
 98     jclass clz = env->FindClass("com/peter/lowlevel/LedNative");
 99     if(clz == NULL){
100         LOGE("ERROR: vm->FindClass failed");
101         return -1;
102     }
103 
104     //3,创建映射表并注册映射表到DVM中
105     //参数1 ----- java本地方法声明所在的类
106     //参数2 ----- 映射表的地址
107     //参数2 ----- 映射表中方法的个数
108     //返回值:  成功--0, 失败--负数
109     if (env->RegisterNatives(clz,led_jni_methods,sizeof(led_jni_methods)/sizeof(led_jni_methods[0])) < 0) {
110         LOGE("ERROR: registerNatives failed");
111        return -1;
112     }
113 
114     return  JNI_VERSION_1_4;
115 
116 }

 

 


 

 

 

 1 LOCAL_PATH:= $(call my-dir)
 2 include $(CLEAR_VARS)
 3 
 4 LOCAL_MODULE_TAGS := optional
 5 
 6 LOCAL_MODULE:= libled_jni
 7 
 8 LOCAL_SRC_FILES:=  led_jni.cpp
 9 
10 
11 LOCAL_SHARED_LIBRARIES :=  \
12             libutils     \
13             libhardware
14 
15 LOCAL_C_INCLUDES +=  $(JNI_H_INCLUDE)            //指定头文件:jni.h 的路径
16 
17 include $(BUILD_SHARED_LIBRARY)

 

posted @ 2019-06-09 13:24  panda_w  阅读(276)  评论(0编辑  收藏  举报