Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android HAL 开发 (2)

Android HAL 开发 (2)

作者头像
程序员小顾
修改于 2021-11-27 08:18:33
修改于 2021-11-27 08:18:33
47900
代码可运行
举报
文章被收录于专栏:fjalfjal
运行总次数:0
代码可运行

在上一篇文章中,我们看到了如何撰写HAL层的用户硬件驱动程序,我们每也知道,最终该代码会被编译成动态链接库提供给service(jni)使用,那么我们下面来看看service(jni)是如何与HAL通信的。

一般service的jni代码位于framework/base/service/jni/中,我们看看mokoid的ledservice是如何实现的:

framework/base/service/jni/com_mokoid_server_LedService.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.  static const JNINativeMethod gMethods[] = { 
2.  { "_init",      "()Z",  (void *)mokoid_init }, 
3.  { "_set_on",        "(I)Z", (void *)mokoid_setOn }, 
4.  { "_set_off",       "(I)Z", (void *)mokoid_setOff }, 
5.  }; 

7.  int register_mokoid_server_LedService(JNIEnv* env) { 
8.  static const char* const kClassName = 
9.  "com/mokoid/server/LedService"; 
10.  jclass clazz; 

12.  /* look up the class */ 
13.  clazz = env->FindClass(kClassName); 
14.  if (clazz == NULL) { 
15.  LOGE("Can't find class %s\n", kClassName); 
16.  return -1; 
17.  } 

19.  /* register all the methods */ 
20.  if (env->RegisterNatives(clazz, gMethods, 
21.  sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK) 
22.  { 
23.  LOGE("Failed registering methods for %s\n", kClassName); 
24.  return -1; 
25.  } 

27.  /* fill out the rest of the ID cache */ 
28.  return 0; 
29.  } 

上面的函数 register_mokoid_server_LedService会把以C/C++实现的接口注册为java可调用的接口,比如mokoid_init为C/C++代码,

而_init则位java可以使用的接口。这个函数会在JNI_OnLoad里面被调用。

再看看下面C/C++接口的具体实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.  /** helper APIs */ 
2.  static inline int led_control_open(const struct hw_module_t* module, 
3.  struct led_control_device_t** device) { 
4.  return module->methods->open(module, 
5.  LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device); 
6.  } 

8.  static jboolean mokoid_init(JNIEnv *env, jclass clazz) 
9.  { 
10.  led_module_t* module; 

12.  if (hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module) == 0) { 
13.  LOGI("LedService JNI: LED Stub found."); 
14.  if (led_control_open(&module->common, &sLedDevice) == 0) { 
15.  LOGI("LedService JNI: Got Stub operations."); 
16.  return 0; 
17.  } 
18.  } 

20.  LOGE("LedService JNI: Get Stub operations failed."); 
21.  return -1; 
22.  } 

24.  static jboolean mokoid_setOn(JNIEnv* env, jobject thiz, jint led)  
25.  { 
26.  LOGI("LedService JNI: mokoid_setOn() is invoked."); 

28.  if (sLedDevice == NULL) { 
29.  LOGI("LedService JNI: sLedDevice was not fetched correctly."); 
30.  return -1; 
31.  } else { 
32.  return sLedDevice->set_on(sLedDevice, led); 
33.  } 
34.  } 

36.  static jboolean mokoid_setOff(JNIEnv* env, jobject thiz, jint led)  
37.  { 
38.  LOGI("LedService JNI: mokoid_setOff() is invoked."); 

41.  if (sLedDevice == NULL) { 
42.  LOGI("LedService JNI: sLedDevice was not fetched correctly."); 
43.  return -1; 
44.  } else { 
45.  return sLedDevice->set_off(sLedDevice, led); 
46.  } 
47.  } 

从上面可以看到当init的时候,该jni service通过hw_get_module得到led的module,然后通过module->methods->open()打开该硬件,并且得到led硬件操作的

结构体(led_control_device_t)对象。

接着在mokoid_setOn和mokoid_setOff中分别利用led_control_device_t中的set_on和set_off进行相应的操作。

该jni service会被编译成libmokoid_runtime的动态链接库,提供给java service调用。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android HAL 开发 (1)
最近开始看Android的HAL开发方面的东东,发现现在国内研究这个的并不多,来自台湾的Jollen可能是走在Android HAL研究的最前沿,这也和他以前专注做嵌入式linux(openmoko)的工作经历有关,毕竟Android的application开发是基于Java的,而之前Jollen做的更多的还是C/C++开发,因此选择从HAL作为进入Android的shortcut还是很明智的,我以前也主要是做linux kernel以及基于C/C++的app开发,现在转作Android,发现它的HAL比较有意思,也是可以研究的一个很好的方向。
程序员小顾
2021/11/26
7970
【android开发】Android HAL模块实现
1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。 总结下来,Andr
程序员互动联盟
2018/03/13
2.6K0
【android开发】Android HAL模块实现
Android HAL 开发 (3)
 在上一篇文章中我们分析了jni的led service代码,该代码通过调用led的HAL层代码,实现了mokoid_init, mokoid_setOn, mokoid_setOff三个C/C++接口,但是该接口还无法直接提供给java程序使用,因此还需要一段java代码通过jni调用这些操作接口。
py3study
2020/01/06
5770
【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通
-- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git
韩曙亮
2023/03/27
3.5K0
【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通
使用 Go 语言开发 Android 应用的正确姿势探索
因此使用java或是kottin开发Android应用是自然的,是原生的应用且速度也是很快的。
杨永贞
2020/08/04
13.5K0
Android HAL 与 HIDL 开发笔记
之前分析过 Android 系统中的进程间通信逆向,即基于 Binder 拓展的以及 AIDL 描述的 IPC。了解 Android 系统的话应该知道在 8.0 之后,/dev/binder 拓展多出了两个域,分别是 /dev/hwbinder 和 /dev/vndbinder 。其中 hwbinder 主要用于 HIDL 接口的通信,而 vndbinder 则是专注于 vendor 进程之间的 AIDL 通信。
evilpan
2023/02/12
1.8K0
Android新增LED设备--从底层到上层理解安卓架构
为了更好的理解安卓的层次关系,本文在RK3399的安卓系统上增加LED灯的外设,并使用APP打开关闭LED灯。以这样一个最简单的实例,来演示从上层到底层的调用过程。首先从最底层的kernel层开始。
Jasonangel
2021/08/26
3K0
Android新增LED设备--从底层到上层理解安卓架构
JNI--动态注册
静态注册: 每个class都需要使用javah生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运行效率 用javah 生成头文件方便简单 动态注册: 使用一种数据结构JNINativeMethod来记录java native函数和JNI函数的对应关系 移植方便(一个java文件中有多个native方法,java文件的包名更换后)
aruba
2020/07/03
6560
JNI操作接口实践(三)
        前面我们介绍了JNI的常规注册方法(静态注册方法),并对JNI各种典型应用做了一个实践演练。本文我们介绍JNI的另一个注册方法:动态注册方法
用户4148957
2022/06/14
3240
JNI开发探索之旅
由于工作上的需求需要使用java和c++互调实现功能,所以要对jni进行深入研究,故此入坑。对安卓也比较感兴趣,大学里还做过几个APP,现在已经很久没有写界面布局这方面的了...
凌霄plus
2023/02/14
1K0
JNI开发探索之旅
NDK--C语言线程运用及jni创建线程
关于linux中线程的知识:https://blog.csdn.net/wucz122140729/article/details/98588567 关于linux中线程同步的知识:https://blog.csdn.net/wucz122140729/article/details/98589012 linux线程是由进程模拟,和进程没有什么本质上的区别,相比于进程,线程在使用上便利很多,线程之间可以共享数据,但这也带来了一系列的问题。在我们在一个线程中对一个数据进行操作时,有时不希望别的线程修改数据
aruba
2020/07/02
1.6K0
Java之JNI开发流程
​ 之前介绍过C/C++和Python的相互调用,这一次笔者讲解C/C++和Java的相互调用。Java与C的相互调用需要使用JNI,JNI即Java Native Interface(Java本地接口)。Google提供了NDK(Native Development Kit), NDK包含了一套Android的交叉编译环境和开发库,使用它可以编写C/C++程序后编译成Android环境下使用的动态链接库,Java代码使用JNI规范调用C/C++实现的动态链接库。本文先介绍在命令行下使用JNI,随后介绍在Android Studio中使用JNI。
菜菜cc
2022/11/15
2K0
Java之JNI开发流程
手把手教你如何在Android下进行JNI开发(入门)
(1)LOCAL_PATH:=$(callmy-dir) :指向当前目录的地址,包含该.mk
xuexiangjys
2022/04/18
5.5K0
手把手教你如何在Android下进行JNI开发(入门)
JNI原理
1.通过System.loadLibrary()或System.load()加载动态库
老马的编程之旅
2022/06/22
9350
JNI原理
ndk开发之native层访问java层
  java层的成员变量可以分为实例变量和静态变量,不过他们的访问方法比较类似,可以分为以下三步:
故乡的樱花开了
2023/10/22
2760
ndk开发之native层访问java层
支付宝二维码脱机认证库在android的app下测试过程记录
今天收到了第三方库(支付宝的二维码脱机认证库,用来脱机验证支付宝的支付二维码),于是兴奋着调用一下试试,如果测试成功,那么做应用自然也没太大问题。
杨永贞
2020/08/05
4940
支付宝二维码脱机认证库在android的app下测试过程记录
什么是动态注册?什么是静态注册?
默认情况下,就是静态注册,静态注册是最简单的方式,NDK开发过程中,基本上使用静态注册。前面的知识都是静态注册的方式。
派大星在吗
2021/12/18
2.1K0
调试支付宝脱机认证接口遇到的问题总结
通过 android的JNI调用支付宝脱机认证库本地接口时,我欲返回一个类的实例,但是却报了几个错,最后查出来了原因。在此总结下。
杨永贞
2020/08/05
6180
Android通过jni调用本地c/c++接口方法总结
网上这方面介绍的文章有很多,但都较凌乱或者不够系统,啰里啰唆一大堆前戏,不如实战来的快。长篇大论真没必要,我们只想上手用,先用起来再说,其他需要了再深入。为了做到通俗易懂和尽可能的简单,直接举例说明吧。举一个详细的例子从头到尾完整实现一遍,保证看一遍就会上手会用。
杨永贞
2022/11/21
2.6K0
Android通过jni调用本地c/c++接口方法总结
Android JNI学习(三)——Java与Native相互调用
前面两篇文章简单的介绍了JNI,下面我们就进一步了解下一下JNI的调用原则,要想了解JNI的调用原则, 前面我们说了JNI中的JNIEnv以及Java类型和native中的类型映射关系。下面我们先来看注册native函数
隔壁老李头
2018/08/30
2.9K0
Android JNI学习(三)——Java与Native相互调用
相关推荐
Android HAL 开发 (1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验