zoukankan      html  css  js  c++  java
  • 代码示例_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---------------
    ",__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---------------
    ");
     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---------------
    ");
     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---------------
    ",__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---------------
    ",__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---------------
    ",__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---------------
    ",__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 待续。。。
  • 相关阅读:
    HDFS命令操作和高可用
    nginx-nginx和反向代理概念
    day01 Hadoop 简单介绍及架构设计
    常用正则表达式
    【JavaWeb笔记】第二章 JDBC
    【JavaSE笔记】第二章 进制数据类型和运算符
    LeetCode-94 Binary Tree Inorder Traversal Solution (with Java)
    LeetCode-1019 Next Greater Node In Linked List Solution (with Java)
    LeetCode-946 Validate Stack Sequences Solution (with Java)
    LeetCode-739 Daily Temperatures Solution (with Java)
  • 原文地址:https://www.cnblogs.com/panda-w/p/10993254.html
Copyright © 2011-2022 走看看