好记性不如烂笔头------按键灯jni使用,打包成so文件并使用

MTK平台如果在硬件上增加了按键灯,第三方APP和framework层想要调用的话,均需要通过jni接口,具体用法不太一样,这里简单介绍一下我的使用过程。

首先,需要增加KeyLed.c和头文件KeyLed.h两个接口函数:

(\hardware\libhardware_legacy\key_leds\key_leds.c)

( \hardware\libhardware_legacy\include\hardware_legacy\KeyLed.h)

1,这里简单介绍一下打包成so文件的方法(工具eclipse,NDK):

将key_leds.c和key_leds.h文件放入应用程序中jni目录下,增加C++接口jni_key_leds.cpp,jni_key_leds.h,Android.mk文件,目录结构如下:

文件说明:

Android.mk:(定义so名称,引入头文件等)内如如下

 1 LOCAL_PATH:= $(call my-dir)
 2 include $(CLEAR_VARS)
 3
 4 LOCAL_MODULE    := jni_key_leds
 5 LOCAL_MODULE_TAGS := optional
 6
 7 LOCAL_C_INCLUDES +=     8     $(JNI_H_INCLUDE)     9     $(LOCAL_PATH)/key_leds.h 10     $(LOCAL_PATH)/key_leds.h 11     $(LOCAL_PATH)/pressure.h
12
13 LOCAL_SRC_FILES := 14     jni_key_leds.cpp    15     key_leds.c 16     pressure.c
17
18 LOCAL_SHARED_LIBRARIES := libutils
19
20 LOCAL_LDLIBS := -llog
21
22 LOCAL_STATIC_LIBRARIES :=
23
24 LOCAL_CFLAGS +=
25
26 LOCAL_PRELINK_MODULE := false
27
28 include $(BUILD_SHARED_LIBRARY)

Application.mk:

1 APP_STL := gnustl_static
2 APP_GPPFLAGS := -frtti -fexceptions
3 APP_ABI := all

APP_ABI : 默认情况下,NDK的编译系统根据 "armeabi" ABI生成机器代码。可以使用APP_ABI 来选择一个不同的ABI,

比如:为了在ARMv7的设备上支持硬件FPU指令。可以使用  APP_ABI := armeabi-v7a

或者为了支持IA-32指令集,可以使用      APP_ABI := x86

或者为了同时支持这三种,可以使用       APP_ABI := armeabi armeabi-v7a x86

APP_ABI := all全部编译出来


jni_key_leds.cpp:引入接口文件和头文件,写方法接口

 1 #include <jni.h>
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9 #include <math.h>
10 #include <string.h>
11
12 #include "jni_key_leds.h"
13 #include "key_leds.h"
14 #include "pressure.h"
15
16 #include <android/log.h>
17
18 #define  LOG_TAG    "MainActivity"
19 #define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
20
21 extern "C" {
22
23 JNIEXPORT jint JNICALL Java_com_elderposition_util_DeviceManager_red1LedsExists(
24         JNIEnv * env, jobject obj) {
25     LOGD("red1_leds_exists !!!");
26     return red1_leds_exists();
27 }
28 JNIEXPORT jint JNICALL Java_com_elderposition_util_DeviceManager_red2LedsExists(
29         JNIEnv * env, jobject obj) {
30     LOGD("red2_leds_exists !!!");
31     return red2_leds_exists();
32 }
33 .......
34 }

jni_key_leds.h:

 1 #ifndef __JNI_KEY_LEDS
 2 #define    __JNI_KEY_LEDS    1
 3
 4 #ifdef __cplusplus
 5 extern "C" {
 6 #endif
 7
 8 JNIEXPORT jint JNICALL Java_com_elderposition_util_DeviceManager_red1LedsExists(
 9         JNIEnv * env, jobject obj);
10 JNIEXPORT jint JNICALL Java_com_elderposition_util_DeviceManager_red2LedsExists(
11         JNIEnv * env, jobject obj);
12 }

key_leds.c:接口文件,方法(注意方法名,程序的完整路径中用"_"连接)

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <errno.h>
 5
 6 #define RED1_DEVICE "/sys/devices/platform/key_leds/red1_leds_onoff"
 7 #define RED2_DEVICE "/sys/devices/platform/key_leds/red2_leds_onoff"
 8 #define RED3_DEVICE "/sys/devices/platform/key_leds/red3_leds_onoff"
 9 #define BLUE_DEVICE "/sys/devices/platform/key_leds/blue_leds_onoff"
10 #define GREEN_DEVICE "/sys/devices/platform/key_leds/green_leds_onoff"
11
12 int red1_leds_exists()
13 {
14     int fd;
15
16 #ifdef QEMU_HARDWARE
17     if (qemu_check()) {
18         return 1;
19     }
20 #endif
21
22     fd = open(RED1_DEVICE, O_RDWR);
23     if(fd < 0)
24         return 0;
25     close(fd);
26     return 1;
27 }

key_leds.h:接口头文件

 1 #ifndef _HARDWARE_IR_LEDS_H
 2 #define _HARDWARE_IR_LEDS_H
 3
 4 #if __cplusplus
 5 extern "C" {
 6 #endif
 7
 8 int red1_leds_exists();
 9
10 int red2_leds_exists();
11 }

以上步骤完成后,在eclipse中编译出so文件后,即可在第三方APP中使用了。

第三方APP想要使用jni时,可以将打包成so的文件放在lib文件夹下使用,用法同其他API一样:

public class DeviceManager {

static {
System.loadLibrary("jni_key_leds");//关键点1,引入so文件
}

public native int red1LedsExists(); //关键点2,对应每个方法写接口

public native int red2LedsExists();

public native int red3LedsExists();

public native int blueLedsExists();

public native int greenLedsExists();

}

2,上层使用jni(从java层到framework到JNI到HAL到kernel的用法过程)

时间: 2024-07-28 19:54:06

好记性不如烂笔头------按键灯jni使用,打包成so文件并使用的相关文章

好记性不如烂笔头------按键灯jni使用(上层)

上层使用jni(从java层到framework到JNI的用法过程) MTK平台如果在硬件上增加了按键灯,framework层想要调用的话,这里简单介绍一下我的使用过程. 首先,需要增加KeyLed.c和头文件KeyLed.h两个接口函数: (\hardware\libhardware_legacy\key_leds\key_leds.c) ( \hardware\libhardware_legacy\include\hardware_legacy\KeyLed.h) 接下来需要一步步向上写接口

从“好记性不如烂笔头”“记问之学不足为人师”到“一事不知是我之耻”

“好记性不如烂笔头”错在一笔记容易丢失,二考验随时发生而笔记常不随身.因此记到大脑里最可靠. “记问之学不足为人师”错在低估记忆力的作用而盲目推崇推理逻辑,这像不打地基盖楼,要不不牢靠要不会垮. “一事不知是我之耻”这是一种认真积极的态度,这样才能应付随时出现的挑战. 2017年3月12日00:34:22

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

好记性不如烂笔头

今天再次深刻领悟这个技能.tm竟然忘记博客园的用户名了.... 好记性不如烂笔头,布布扣,bubuko.com

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

博客开通啦,好记性不如烂笔头

好记性不如烂笔头,勤能补拙.2016年,我即将步入工作,结束十多年的学生生活.如果说,人生每一个阶段都是一个新的开始,那么,今年又是我新生的一年. 新年新希望, 第一:希望自己能够工作顺利,在自己的岗位上做一个称职又出色的员工 第二:希望自己能够每天都开开心心的 第三:努力变美,努力减肥.多读书,多看报,少吃零食多运动- 第四:努力学习.学习才能使自己更上一层楼,才能让自己实现自己的愿望,学无止境,自制,坚持,总结,记录. 第五:希望家人和朋友们都开开心心的,心想事成万事如意. 第六:希望,我和

好记性不如烂笔头(零)

俗话说,好记性不如烂笔头! 在平常的开发工作中,很多时候我们都会用到一些代码量比较小,但是却很有用的功能,但是,都只是写过就算,下一次再想起来用的时候,已经不知道该去哪儿找了. 常常因为这些小点而浪费时间,也随着年纪渐长,智商有限,还是靠记下来,以备不时之需呀. 获取圆形图片 /** * bitmap 要进行剪裁的位图 * size 剪裁的圆形图片的大小 */ public static Bitmap getCroppedRoundBitmap(Bitmap bitmap, int size)