binder介绍——JNI的架构和实现

新书上市《深入解析Android 5.0系统》 《深入解析Android 5.0系统》详细剖析了最新Android 5.0 系统主要框架的原理和具体实现。本书共24章,覆盖了Android 5.0 系统中、下层重要的模块,对于每个模块都详细介绍了它们的架构、原理及代码实现等各个方面,尽量让读者知其然,又知其所以然,达到学以致用的目的。主要内容为: Android Build系统核心、Android的Bionic、系统调用的 阅读详情

首先介绍一下JNI设计的目的:

JNI是Java Native Interface的缩写:

    The standard Java class library may not support the platform-dependent features needed by your application.

   You may already have a library or application written in another programming language and you wish to make it accessible to Java applications

    you may want to implement a small portion of time-critical code in a lower-level programming language,such as assembly, and then have your Java application call these functions.

Android系统中使用JNI原因

Android上层使用Java语言来开发应用程序,而且在Android系统架构图中可以看到,Android  framework层也都是向应用开发者提供Java API,但是所有的本地库都使用了C/C++来实现,这就需要使用JNI方式向Java提供接口,是java层的接口能调用本地的具体实现。

JNI架构

Android  framework层中的API大部分调用了native方法,这些方法也都由本地代码来实现,然后注册到系统中。注册过程需要使用Dalvik中的一个工具库nativehelper,该库的主要用于注册Java本地调用的函数(即通过JNI方式向上层提供接口)。

实现nativehelper库的源代码位于“dalvik\libnativehelper”目录中,最终将被编译为libnativehelper.so动态链接库。通常使用JNI方式时需要使用该库,其主要头文件如下:

dalvik\libnativehelper\include\nativehelper\jni.h(基于JNI标准的头文件)

dalvik\libnativehelper\include\nativehelper\JNIHelper.h(提供JNI注册功能的头文件)

具体的JNI代码的实现主要位于frameworks\base\core\jni\目录中,实现了Android API的大部分功能,最终将被编译为libandroid_runtime.so动态链接库,放置在out目录下的\system\lib目录中。

JNI的实现

实际上JNI需要实现的主要内容有两个:首先将java、代码中声明的原生方法在本地注册。然后注册到系统中。

Q:

在我们编写JNI的时候,很有可能导致系统启动的过程中,启动失败。分析主要的原因有两个方面:一是我们找不到class,另一种是我们找不到nativemethod。这两种情况都是我们在编写文件的时候的java和cpp的函数或者路径名称不匹配造成的。因此在此种情况下我们一定要仔细检查一边。此前出现问题的时候,我还白白的认为是android有什么玄机导致我们不能修改和添加文件和函数。后来发现是自己的粗心造成的。

JNI、Binder、NDK 的关系解析(类比 + 场景化说明) 需求:游戏逻辑(C++,NDK)与渲染(另一个 C++ 进程,NDK)高速通信。方案用 NDK 实现 Native Binder 服务(类似 Java 的 AIDL,但全 C++)。通过 JNI 在 Java 层暴露简化接口(可选)。Binder 驱动负责跨进程数据传输(一次内存拷贝,高性能)。四、对比与总结维度JNIBinderNDK作用跨语言(Java ↔ C/C++)跨进程(IPC)支持 Native 开发(C/C++)层级语言边界进程边界开发工具链协作场景。 阅读详情

相关推荐

Android Binder——JNI层介绍(四)

JNI(Java Native Interface)是 Java 平台提供的一种机制,允许 Java 代码与本地应用程序(如C/C++)进行交互。在 Android 中,JNI 层主要用于实现 Java 层与底层 C/C++ 代码之间的通信。通过 JNI,Android 系统可以将一些性能要求较高的功能(如图像处理、音频处理等)用 C/C++ 实现,以提高系统的运行效率。本地方法实现:Java 层通过 JNI 调用底层 C/C++ 代码实现的方法。这些方法可能涉及到底层硬件操作、性能优化等。数据转换。

小旭的专栏 1223

Binder ——binder的jni注册和binder驱动

Binder的jni注册和binder驱动

l18320786461的博客 925

rk3288 android6.0 camera子系统 - 概述

概述 camera kernel驱动是基于Linux的v4l2驱动,设备名/dev/videox。camera系统采用Client/Service构架,通过Binder IPC来通信,最终Client通过调用Service接口实现各个具体功能。Service进程负责和kernel驱动交互,并将数据给到其它模块,比如显示系统。   Java层: 应用:com.android.camer...

智能硬件研发,欢迎交流 1110

binder注册与启动

binder的jni方法注册 1.zygote启动 1-1.启动zygote进程 zygote是由init进程通过解析 init.zygote.rc 文件而创建的,zygote所对应的可执行程序 app_process,所对应的源文件是 app_main.cpp ,进程名为zygote // system/core/rootdir/init.zygote32.rc service zygote /system/bin/app_process -Xzygote /system/bin --zygot

qq_32671919的博客 538

Android NDK实现Binder服务和客户端

需要在系统源码下编译,或者提取出对应的头文件亦可。这里需要注意Android4.x以后系统SeLinux如果打开,系统级需要配置对应的sepolicy才能使用。测试阶段推荐直接setenforce 0关闭鉴权即可

通达信+大智慧数据同步存调DLL

数据同步存调DLL(通达信版+大智慧版)

guleba的博客 2053

通过binder实现系统和app匿名内存共享

系统和app数据交互的方式有很多种,如:jni、socket、binder等 这个方法都各有优缺点 1、jni 优点:直接调用,访问快 缺点:代码量大,至少需要实现本地server、jni及java本地调用三部分的代码 2、socket 优点:基于C/S架构,代码量较少 缺点:需要两次内存拷贝,效率低下 3、binder 优点:基于C/S架构,代码量较少,只进行一次内存拷贝,相对于

80后的梦想 890

活用QueryWrapper与@Select注解,构建MybatisPlus动态多表查询方案

本文深入探讨了如何结合MybatisPlus的QueryWrapper与@Select注解,构建高效灵活的动态多表关联查询方案。通过解析${ew.customSqlSegment}占位符机制,并设计通用的Service层封装,解决了复杂条件下多表查询的SQL拼接难题,显著提升了后台管理系统列表查询的开发效率与可维护性。

weixin_29291069的博客 271

android 系统核心机制binder(10)binder java层JNI初始化

系列文章解读&说明: Android系统核心机制binder的分析主要分为以下部分: android 系统核心机制binder(01)C语言简谈binder android 系统核心机制binder(02)binder驱动层原理 android 系统核心机制binder(03)binder C++层实现 android 系统核心机制binder(04)binder C++层 Te...

wangdsh的博客 1216

Plant Simulation新手入门:5步搞定生产线物流仿真(附模型库使用技巧)

本文为Plant Simulation新手提供了从零开始构建生产线物流仿真的五步入门指南。通过理念重塑、流程规划、对象连接、参数设置到数据分析的完整流程,帮助用户快速掌握这一强大仿真工具的核心逻辑。文章特别强调了模型库的高效使用技巧,助力工程师在虚拟环境中精准模拟和优化生产系统,提升规划效率。

efc123456的博客 334

YOLOv8实战:如何用Focaler-IoU提升小目标检测精度(附代码)

本文详细介绍了如何通过Focaler-IoU提升YOLOv8在小目标检测中的精度,包括核心机制解析、代码实现及调优策略。Focaler-IoU通过动态聚焦机制有效解决传统IoU对小目标检测的不足,显著提升模型性能。附有完整的代码示例和实战指南,适合计算机视觉开发者参考。

weixin_29044157的博客 362

Android Binder -1

Binder -1 IPC Android基于Linux内核,Linux内核继承和兼容了Unix的进程间通信机制,故进程间通信机制(IPC,Inter-Process Communication)代代相传。 下面简单介绍IPC的定义,总结主要的IPC方法、系统环境及其特点: 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程...

qq_30092495的博客 286

Starlink地面终端天线对星(一)对星流程,星历下载,信标信号

starlink卫星终端对星采用机械伺服+相控阵电子扫描的混合模式,兼顾快速盲扫和高精度跟踪;对星流程分三步:冷启动与盲捕获 → 建立初始链路并下载星历 → 进入正常通信模式;

chen2jiang3的博客 2724

android camera 算法,Android的Camera架构介绍

第一部分 Camera概述Android的Camera包含取景器(viewfinder)和拍摄照片的功能。目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。以开源的Android为例,Camera的代码主要在以下的目录中:Camera的JAVA程序的路径:packages/apps/Ca...

weixin_30035343的博客 584

达梦数据库修改最大连接数

达梦数据库的最大连接数推荐配置与服务器内存有关。不应设置得过大,否则容易导致出现OOM。文件中整型的参数值。DSC环境下,除了特殊参数以外,其他参数值会在OK节点上同步。返回值:当前DM.INI文件中对应的参数值。功能说明:返回DM.INI文件中。:DM.INI文件中的参数名。

Sebastien23的博客 3333

RK3588芯片CAN总线调试秘籍:SocketCAN与错误帧攻略

RK3588芯片在嵌入式领域凭借8nm工艺和强大性能成为核心控制器。本文详细介绍了其CAN总线配置流程,包括硬件连接、内核驱动配置及SocketCAN命令操作,并深入解析了CAN通信中的错误帧机制及分析方法。通过智能工厂案例,展示了从问题定位到解决方案的全过程,强调了稳定通信对工业应用的重要性。文章为RK3588的CAN总线应用提供了实用技术参考,并对未来智能诊断技术在该领域的应用进行了展望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 516

Android 的Camera架构介绍

Android 的Camera架构介绍

weixin_41524006的博客 1876

机器学习之多种算法优缺点总结及优化方法

一、无监督算法: 1、聚类算法:Kmeans 2、关联规则算法:Apriori 二、有监督算法 1、分类算法 决策树(Decision Tree) 支持向量机(SVM) K近邻(kNN,k-NearestNeighbor) 朴素贝叶斯 逻辑回归 2、回归算法 线性回归 多项式回归 3、集成算法 a、bagging(Bootstrapped Aggregation) 随机森林 ...

平原的博客 7081

Android的MediaPlayer架构介绍

本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构。对于Android这样一个完整又相对复杂的系统,一个MediaPlayer功能的实现不在其具体的功能,而是具体功能如何适应Android系统Android MediaPlayer的主要具体实现在OpenCore的Player

menuconfig的专栏 1964

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 移植usb摄像头,014-Android平台开发-Camera function porting-摄像头功能移植

一、Camera概述1、Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/其中Camera.java是主要实现的文件frameworks/base/core/java/android/hardware/Camera.java这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。2、Cam...

weixin_42365422的博客 401

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

安卓Framework 层详解

Android Framework 实际上分为两个主要部分: 一、Java Framework 层详解 1.1 定义和位置 Java Framework 是用 Java 编写的框架层,位于: 1.2 核心作用 作用 1:提供应用开发 API 这是开发者直接使用的 API 层: 提供的 API 包括:许多系统服务的主要逻辑用 Java 实现: 作用 3:封装和抽象底层实现 Java Framework 隐藏了底层复杂性: 1.3 Java Framework 的主要模块 模块

weixin_74166153的博客 2043

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Bluetooth

Bluetooth Android provides a default Bluetooth stack, BlueDroid, that is divided into two layers: The Bluetooth Embedded System (BTE), which implements the core Bluetooth fu...

weixin_30362083的博客 99

MediaPlayer调用过程

framework 架构: MediaServer是整个android中media部分的核心。frameworks\base\media\mediaserver\main_mediaserver.cpp 中main 函数是程序的入口 简单的调用过程: frameworks/base/media/java/android/media/MediaPlayer.java --...

qq_28575493的博客 782

Binder解析 (1)- Binder的JNI注册

预加载类和资源:通过复制自身进程快速创建应用进程,提高启动速度。进程孵化:通过 Unix 域套接字接收孵化请求,为每个应用创建独立进程。系统服务启动:启动 Android 核心系统服务(如 ActivityManager、WindowManager 等)。此配置确保 Zygote 以最高优先级运行,并在崩溃时自动恢复依赖服务,维护系统稳定性。

JonrayZ的博客 1565
上一篇: Android frameworks层启动分析
下一篇: Android 启动过程简介
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值