代码示例_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)
Stay hungry, stay foolish
待续。。。