TQ210搭载Android4.0.3系统构建之LED从驱动到HAL到JNI到应用程序(JNI篇)

发布者:AngelicGrace最新更新时间:2025-02-14 来源: cnblogs关键字:TQ210  LED 手机看文章 扫描二维码
随时随地手机看文章

开发板:TQ210


OS:Android 4.0.3


以下所有内容都是在TQ210开发板上实现,并且很多内容也是天嵌公司提供,我将一些内容进行了删减、替换,然后加入了一些自己的理解,同时也是记录自己学习的旅程。


led_unders_led_jni.c


#include   //包含jint JNINativeMethod...

#include   //包含__android_log_print...

#include

#include

#include


#define false      0

#define true        1


#ifdef __cpulspuls

extern 'C' {  //使用C语言的方式进行编译和连接

#endif


static struct led_control_device_t *ledundersdevice=NULL;  //led设备指针


static inline int led_control_open(struct hw_module_t *module,struct led_control_device_t **device)

{

//通过module的open方法找到device,并赋值给ledunderdevice

int err=module->methods->open(module,LED_UNDERS_HARDWARE_MODULE_ID,(struct hw_device_t **)device);

__android_log_print(ANDROID_LOG_DEBUG,'msg','led_control_open ,err=%d',err);

return err;

}


static jboolean led_close(JNIEnv *env,jclass clazz)  //关闭设备

{

if(ledundersdevice)  //关闭设备

ledundersdevice->common.close(&(ledundersdevice->common));

return 0;

}


static jboolean led_setOn(JNIEnv *env,jclass clazz,jint number) //打开led

{

if(ledundersdevice)

return ledundersdevice->led_on(ledundersdevice,number);

return false;

}


static jboolean led_setOff(JNIEnv *env,jclass clazz,jint number) //关闭led

{

if(ledundersdevice)

return ledundersdevice->led_off(ledundersdevice,number);

return false;

}





static jboolean led_init(JNIEnv *env,jclass clazz) //初始化本地函数

{

struct led_module_t *module;

//通过ID查找到模块

int err=hw_get_module(LED_UNDERS_HARDWARE_MODULE_ID, (const  hw_module_t **) &module);

if(err==0)

{

//通过module的common成员,找到设备指针并赋给ledunderdevice

if(led_control_open(&(module->common),&ledundersdevice)==0) return true;

}

ledundersdevice=NULL;

__android_log_print(ANDROID_LOG_DEBUG,'msg','led_init failed.n');

return false;

}


static JNINativeMethod methods[]=  //方法数组

{

{'led_init','()Z',(void *)led_init},

{'led_setOn','(I)Z',(void *)led_setOn},

{'led_setOff','(I)Z',(void *)led_setOff},

{'led_close','()Z',(void *)led_close},

};


jint register_native_led_method(JNIEnv *env) //注册本地方法

{

static char *className='com/unders/led/LedUnderActivity'; //对应于上层应用的类的完整路径

jclass clazz;

clazz=(*env)->FindClass(env, className); //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.

if(clazz==NULL)

{

__android_log_print(ANDROID_LOG_DEBUG,'msg','can not find class %s',className);

return -1;

}

if((*env)->RegisterNatives(env,clazz,methods, sizeof(methods)/sizeof(methods[0]))!=JNI_OK)

{

__android_log_print(ANDROID_LOG_DEBUG,'msg','can not register native.n');

return -1;

}

return 0;

}




jint JNI_OnLoad(JavaVM * vm, void * reserved)  //加载库时,第一个调用的函数

{

JNIEnv *env=NULL;  //JNI函数的接口指针 pointer to the location where the JNI interface pointer for the current thread will be placed.

jint result=-1;

if((*vm)->GetEnv(vm,(void **)&env,JNI_VERSION_1_4)!=JNI_OK)  //判断JNI_VERSION_1_4这个版本是否支持

{

__android_log_print(ANDROID_LOG_DEBUG,'msg','JNI_VERSION_1_4 not supported.n');

return result;

}

if(register_native_led_method(env)!=0) //注册本地方法

{

__android_log_print(ANDROID_LOG_DEBUG,'msg','register native failed.n');

return result;

}

return JNI_VERSION_1_4;

}


#ifdef __cpulspuls

}

#endif


Android.mk


LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_PRELINK_MODULE :=false

LOCAL_SRC_FILES :=led_unders_led_jni.c

LOCAL_SHARED_LIBRARIES :=libutils

libhardware

LOCAL_MODULE :=libledunders

LOCAL_MODULE_TAGS :=optional

LOCAL_MODULE_PATH :=$(LOCAL_PATH)

include $(BUILD_SHARED_LIBRARY)


      Oracle JNI的官网 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html


     在写JNI之前最好去上面的官网上 看看JNI的一些基本概念 比如JNI的接口函数、Invocation API。。。


    对于JNI,个人的理解,上层APK通过JNI访问HAL提供的接口,从而操纵驱动程序,驱动硬件。


  附:生成的libledunders.so文件放在/system/lib/目录下 apk在装载so文件时 会从该目录下查找匹配的


关键字:TQ210  LED 引用地址:TQ210搭载Android4.0.3系统构建之LED从驱动到HAL到JNI到应用程序(JNI篇)

上一篇:TQ210搭载Android4.0.3系统构建之LED从驱动到HAL到JNI到应用程序(HAL篇)
下一篇:TQ210搭载Android4.0.3系统构建之LED从驱动到HAL到JNI到应用程序(应用程序篇)

推荐阅读最新更新时间:2026-03-23 11:08

TQ210裸机编程(1)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main @跳转到C函数去执行 halt: b halt @死循环 led.c #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int *)0xE0200064) void delay(volatile unsigned int t) { volatil
[单片机]
TQ210搭载Android 4.0.3测试Google Maps API V2(一.获取地图)
硬件环境:tq210 v4开发板 运行环境:Android 4.0.3 开发环境: Eclipse Version: Juno Service Release 2,ADT 22,Android Sdk 22 参考文档: 这位老兄写的很好 有一个错误就是参看他的博客才解决的 中文版: http://www.cnblogs.com/mengdd/archive/2013/01/01/2841390.html Google官网指导手册 英文版: https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_and
[单片机]
<font color='red'>TQ210</font>搭载Android 4.0.3测试Google Maps API V2(一.获取地图)
TQ210搭载Android4.0.3系统构建之BEEP从驱动到HAL到JNI到应用程序(JNI篇)
对于BEEP的JNI层,并没有采用LED所用的JNI_OnLoad的方法,而是直接使用的是JNI的绑定机制,在JNI中与上层应用相对应函数采用的方式如下 详细信息见JNI官网 : http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html beep_under_jni.c #include jni.h #include hardware/hardware.h #include hardware/beep_under_hal.h #include android/log.h #include stdio.h #defin
[单片机]
<font color='red'>TQ210</font>搭载Android4.0.3<font color='red'>系统</font>构建之BEEP从驱动到HAL到JNI到应用程序(JNI篇)
S5PV210(TQ210)学习笔记——按键驱动程序
经过前面的配置,S5PV210开发已经可以成功进入Linux控制台了,那么,有了这个环境就可以开始学习Linux驱动的编写和测试了。学习Linux设备驱动,通常是从字符设备驱动开始。由于linux驱动开发具有比较系统的体系结构,我很难在一篇文章中阐述其开发思路,为了简单起见,从本文开始,自行编写的驱动将直接附上代码,对开发过程中感触比较深的地方稍作陈述。 我写的第一个驱动程序是Led的,但是感觉没有必要发出来了,S5PV210(TQ210)的按键驱动程序源码,仅供参考: #include linux/types.h #include linux/module.h #include linux/cdev.h #incl
[单片机]
TQ210搭载Android4.0.3系统构建之ADC从驱动到HAL到JNI到应用程序(JNI篇)
ADC的JNI层采用的方式与BEEP中JNI层采用的方式是一致的,采用Java+包名+类名+方法名,具体见BEEP的JNI层 直接上源码 adc_under_jni.c #include android/log.h #include jni.h #include hardware/hardware.h #include hardware/adc_under_hal.h static struct adc_hw_device_t *adc_device=NULL; #define true 1 #define false 0 static inline int adc_open(struct hw_mo
[单片机]
基于S3C2440的LED背光源节电系统设计方案
引言 节能环保技术是当前世界所关注的焦点,在液晶显示模组中,背光源的功耗最高可占总功耗的50%以上。尤其在10in 以下显示产品如手机、PDA、MP3 等便携式设备中,基本采用电池供电,功耗问题尤为突出。为有效降低液晶显示器背光源的亮度,以达到节电目的,本文在ARM开发平台上实现了一种基于直方图变换的背光源调光方法,实验证明,本文提出的方法在失真度为5%的情况下可实现背光节电约35%. 1 背光源调光方案 以TFT 液晶面板结构为例,包括背光、偏光片、液晶阵列、彩色滤光片等部分,人眼所感知的显示图像为上述各部分的综合效果。假设背光亮度归一化后设为b(为 区间实数),0 对应于背光关闭情况,1 对应于背光发光亮度最大情况。若
[电源管理]
基于S<font color='red'>3</font>C2440的<font color='red'>LED</font>背光源节电<font color='red'>系统</font>设计方案
基于S3C2440的LED背光源节电系统设计方案
引言 节能环保技术是当前世界所关注的焦点,在液晶显示模组中,背光源的功耗最高可占总功耗的50%以上。尤其在10in 以下显示产品如手机、PDA、MP3 等便携式设备中,基本采用电池供电,功耗问题尤为突出。为有效降低液晶显示器背光源的亮度,以达到节电目的,本文在ARM 开发平台上实现了一种基于直方图变换的背光源调光方法,实验证明,本文提出的方法在失真度为5%的情况下可实现背光节电约35%. 1 背光源调光方案 以TFT 液晶面板结构为例,包括背光、偏光片、液晶阵列、彩色滤光片等部分,人眼所感知的显示图像为上述各部分的综合效果。假设背光亮度归一化后设为b(为 区间实数),0 对应于背光关闭情况,1 对应于背光发光亮度最大情况。若光源为
[电源管理]
基于S<font color='red'>3</font>C2440的<font color='red'>LED</font>背光源节电<font color='red'>系统</font>设计方案
基于S3C4480X的大型LED显示系统设计
大型LED显示系统已经广泛应用于各种室内外场合,但由于其多采用多机系统,提高了系统成本和软硬件设计复杂度。多机系统工作时,本质上相当于一个高总线宽度的计算机系统。其技术难点如下: ◆大型LED显示屏上的像素数以万计,随着显示面积增大,电路结构随之增大。 ◆为了保证一定的显示质量,帧频应在30帧/s以上。对于一个512×252的单色LED屏,每秒的数据传输量至少为480 KB以上,对于彩屏及显示质量高的场合,数据传输量还将按整数倍增长。 ◆当LED屏位于室外时,上下位机通信可能在百米甚至千米以上,要求通信速度快且可靠。 鉴于上述前两个技术难点,为能够使用单CPU系统代替多机系统控制大型LED显示系统,采取的应对策略如下
[电源管理]
基于S<font color='red'>3</font>C4480X的大型<font color='red'>LED</font>显示<font color='red'>系统</font>设计
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved