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)

Android 从上层到底层-----kernel层

Android 从上层到底层-----hal层

Android 从上层到底层-----app层

Android 从上层到底层-----jni层的更多相关文章

  1. Android 从上层到底层-----app层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 MainActivity.java package com.aaron ...

  2. Android 从上层到底层-----hal层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_hal.c path:hardware/rockchip/fi ...

  3. Android 从上层到底层-----kernel层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...

  4. Android Java访问本地方法(JNI)

    当功能需要本地代码实现的时候,Java 代码就需要调用本地代码. 在调用本地代码时,首先要保证本地代码被加载到 Java 执行环境中并与 Java 代码连接在一起,这样 Java 代码在调用本地方法时 ...

  5. Android中关于JNI 的学习(三)在JNI层訪问Java端对象

    前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...

  6. Android开发实践:Java层与Jni层的数组传递

    转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...

  7. Android Jni层 创建 linux socket 出错问题解决

    问题: 想在Jni层创建 udp socket 与服务端通信,可是没有成功.最后发现居然是创建socket失败(代码例如以下) // create socket g_sd = socket(AF_IN ...

  8. 基于Eclipse的Android JNI层測试应用开发过程记录

    前言 本文记录一个Java层与JNI层參数与数据交互的应用程序开发过程.为实现一个功能完整的带Java与JNI的应用程序打下基础. 本文如果读者已搭建好Android的Eclipse与NDK开发环境, ...

  9. Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作

    1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...

随机推荐

  1. js中删除数组中某一项的方法

    1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...

  2. Caesars Cipher

    让上帝的归上帝,凯撒的归凯撒. 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码. 移位密码也就是密码中的字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母 ...

  3. [转载]Java读取Excel中的单元格数据

    目前网上能找到的读取Excel表格中数据的两种比较好的方案:PageOffice好用开发效率高:POI免费.供大家参考,针对具体情况选择具体方案. 1. PageOffice读取excel impor ...

  4. 【Sizzle学习】之关于【初探 jQuery 的 Sizzle 选择器】这篇文章里的小bug

    [题记]不可否认,这篇文章写得非常好,但是今天我在看sizzle源码的时候,发现这文章有一地方说的不妥.重现:当selectors为"p.class1>p.class2",j ...

  5. mysql function动态执行不同sql语句

    create procedure cps() begin ) default 'user'; set strSql = concat('select * from ',table_user); pre ...

  6. html5: 新特性(表单)

    表单: 在html4中,表单内的从属元素必须写在表单内部.在html5中,可以吧他们书写在页面任何位置,然后指定form属性,属性值为表单ID,这样就指定表单了. formaction,formmet ...

  7. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  8. 网页基础学习--网络结构和HTML(未完待续)

    一.网络常见基本结构: 1.B/S网络结构: Browser/Server:浏览器/服务器,这是现在最流行的网络模式.平常的上网:比如新浪网.凤凰网等.我的电脑(客户端)               ...

  9. 文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等

    以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图 ...

  10. 构造字典:DictionaryBase类和SortedList类

    DictionaryBase 类 msdn对DictionaryBase的文档解释 泛型KeyValuePair类 msdnd对泛型KeyValuePair类的文档解释 SortedList类 RUN ...