NDK抄书笔记【枯燥】

简介: 版权归他们:《Android高级开发实战---UI、NDK与安全》 王氏兄弟 1.何为JNI JNI (Java Native Interface) 即Java本地开发接口,也是C/C++与Java通信的一个协议,这个协议可以使Java代码与C/C++代码之间进行沟通,通过该协议,Java代码就可以调用C/C++代码,C/C++代码也可以调用Java代码,这样就可以将Java程序与C/C++程序集成到一起。

版权归他们:《Android高级开发实战---UI、NDK与安全》 王氏兄弟


1.何为JNI

JNI (Java Native Interface) 即Java本地开发接口,也是C/C++与Java通信的一个协议,这个协议可以使Java代码与C/C++代码之间进行沟通,通过该协议,Java代码就可以调用C/C++代码,C/C++代码也可以调用Java代码,这样就可以将Java程序与C/C++程序集成到一起。


2.为什么要用JNI

a. JNI扩张了Java虚拟机的能力。Java语言是不能够直接操作硬件的(Java在实现跨平台操作时,将硬件操作全部封装起来)。例如,Java语言是不能够直接用来开发驱动的,但Java可以通过JNI来做一些驱动开发(驱动开发需要操作硬件,而C语言可以实现对硬件的操作,Java通过JNI协议,可以实现对C的调用)

b. C/C++语言的运行效率高(Java的执行效率相对低一点,魔乐科技的李兴华说:java实在c++的基础上改写而来,C#是由java和c++改写而来),应用比较广泛例如,数学运算、实时渲染Opengl、音/视频处理ffmpeg

c. 直接复用C/C++中的优秀代码(文件压缩、人脸识别)

d. Java不可以手动释放内存,而C/C++可以实现手动控制内存,如果对内存的利用有较高要求时,需要使用C/C++来实现。

e.特殊的业务场景,如高级汽车上安装的车载电脑的onboard debug system,需要获取硬件的电信号


3.如何使用JNI

  NDK,Natvie Develop Kits,·可以将C/C++语言写出来的源代码编译成可执行的文件(文件格式以.so为 扩展名,该文件组成的库称之为“可执行动态库”)。

  Java端需要有JVM和Class类(得到Class对象后,就可以调用该Class中的方法);C/C++端需要有function函数与function.lib函数库。C/C++的函数通过JNI机制去调用Java端的Class方法;Java端通过JNI机制去调用C/C++端的函数或者函数库。JNI在此充当C/C++与Java通信的桥梁。

  Java源码经过被编译后生成了.class文件(Java字节码),通过类加载器将字节码加载到Java类库中,然后再JVM中对字节码进行解释 、翻译后才可以被计算机所识别出来;而C/C++经过编译后,生成了一个.exe文件,没有Java中将数据装载到虚拟机中进行解释、翻译这一步,两者从编译到运行的基本过程比较:C/C++-->(*.exe)-->机器,Java-->(*.class)-->JVM-->机器,这是 C/C++的运行效率高于Java的原因。


4.NDK与JNI的关系 

Java通过JNI机制和C/C++沟通的具体步骤:

a.编写包含native本地方法的Java类

b.通过javah工具生成C/C++语言的头文件

c.使用C/C++语言实现头文件

d.使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库

e.实际执行Java代码去和本地的C/C++代码相互沟通


5.JNI中的Java VM与JNIEnv对象

   在标准的Java平台下,每一个进程里可以产生很多Java VM对象,每一个Java VM对象都有一个与之对应的Java VM对象,但是在Android平台上,每一个进程只能产生一个Dalvik VM对象,也就是说一个Android的进程中是通过有且只有一个虚拟器对象来服务所有的Java和C/C++代码

   Android中的JNIEnv对象与Dalvik的Java VM具体关系:

a. JNIEnv *内部包含一个指针,指针指向Dalvik的Java VM对象的Function Table,JNIEnv *关于程序执行环境众多函数正式来源于Dalvik虚拟机

b.Android中每当一个Java线程第一次要调用本地C/C++代码时,Dalvik虚拟机实例会为该Java线程产生一个JNIEnv*指针

c.Java每条线程在和C/C++相互调用时的JNIEnv*是相互独立的,互不干扰,这就提升了并发执行时的安全性

d.当本地的C/C++代码想获得当前线程所要使用的JNIEnv时可以使用Dalvik VM对象的Java VM* jvm->GetEnv()方法,该方法即会返回当前线程所在的JNIEnv *


6.Java、Dalvik VM、C/C++的运行机制与流程

a.Java的dex字节码和C/C++的*.so同时运行Dalvik VM之内,共同使用一个进程空间。

b.Java和C/C++可以相互调用,其调用的关键均是Dalvik VM

c.一般而言,比较经典的模式是Java通过JNI的C组件和C++相互沟通,一般的业务处理代码是放在C++中的

d.C++代码处于核心的控制地位具有更高的价值


   当Java代码需要C/C++代码时,在Dalvik虚拟机加载进*.so库时,会先调用JNI_OnLoad()函数,此时就会把Java VM对象的指针存储于C层JNI组件的全局环境中。在Java层调用C层的本地函数时,调用C本地函数的线程必然会通过Dalvik VM来调用C层的本地函数,此时Dalvik虚拟机会为本地的C组件实例化一个JNIEnv指针,该指针指向Dalvik 虚拟机的具体的函数列表,当JNI 的C组件调用Java成的方法或者属性时,需要通过JNIEnv指针来进行调用

   当C++组件主动调用Java的方法或属性时,需要 通过JNI的C组件把JNIEnv指针传递给C++组件,此后,C++组件即可通过JNIEnv指针来掌控Java层代码。


关于android系统的图像处理再多说一句,运行时间长的操作尽量都放在服务器端,否则用户会崩溃的。


目录
相关文章
|
JavaScript Shell API
小笔记:Electron中关联格式、处理文件、创建链接的相关编程
小笔记:Electron中关联格式、处理文件、创建链接的相关编程
564 0
|
机器学习/深度学习 人工智能 自然语言处理
|
7月前
|
机器学习/深度学习 存储 缓存
LLM高效推理:KV缓存与分页注意力机制深度解析
随着大型语言模型(LLM)规模和复杂性的增长,高效推理变得至关重要。KV缓存和分页注意力是优化LLM推理的两项关键技术。KV缓存通过存储键值对减少重复计算,而分页注意力则通过将序列分割成小块来降低内存消耗,从而有效处理长序列。本文深入剖析这些技术的工作原理及其在仅解码器模型中的应用,探讨其优势与挑战,并展示其实现示例。
327 16
LLM高效推理:KV缓存与分页注意力机制深度解析
|
7月前
|
安全 Unix 虚拟化
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
244 11
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
|
7月前
|
人工智能 自然语言处理 供应链
国产与国外CRM系统:功能与优势全解析
随着企业数字化转型加速,CRM系统成为提升竞争力的关键工具。国产CRM系统如销售易、神州云动、八骏科技等,以高性价比、本地化服务和灵活定制见长;国外CRM系统如Salesforce、Zoho CRM、Microsoft Dynamics 365等,则在功能创新、全球化支持和技术成熟度上表现突出。企业在选择时应综合考虑自身需求,选取最适合的CRM系统,助力业务高质量增长。
|
9月前
|
机器学习/深度学习 搜索推荐 语音技术
智能语音识别技术在智能家居中的应用与挑战####
本文深入探讨了智能语音识别技术的基本原理、关键技术环节,以及其在智能家居领域的广泛应用现状。通过分析当前面临的主要挑战,如环境噪音干扰、方言及口音识别难题等,文章进一步展望了未来发展趋势,包括技术融合创新、个性化服务定制及安全隐私保护的加强。本文旨在为读者提供一个关于智能语音识别技术在智能家居中应用的全面视角,同时激发对该领域未来发展方向的思考。 ####
699 33
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
深度学习在医疗影像诊断中的应用与前景####
本文深入探讨了深度学习技术在医疗影像诊断领域的应用现状、面临的挑战以及未来发展趋势。通过分析卷积神经网络(CNN)等深度学习模型在处理复杂医学图像时的优势,结合具体案例,如癌症早期检测、疾病分类及分割等方面取得的显著成果,展示了深度学习如何革新传统医疗影像分析方法。同时,文章也指出了数据隐私保护、模型解释性不足、临床集成难度大等问题,并展望了联邦学习、可解释AI、多模态融合等技术在解决这些问题上的潜力,为推动深度学习在医疗健康领域的更广泛应用提供了思路。 ####
580 0
|
运维 安全 网络安全
Digicert 证书
DigiCert是全球领先的数字证书颁发机构,提供SSL/TLS、代码签名等多种证书服务,确保网络通信安全。其证书以高安全性、广泛兼容性及优质客户服务著称。DigiCert的EV SSL证书能严格验证网站身份,增强用户信任。通过代码签名,保证软件未经篡改。适用于商业网站和电商,提供高级安全保障。在网络安全日益重要的今天,DigiCert证书是值得信赖的选择,为数字化世界保驾护航。
339 0
|
缓存 Java Unix
Java使用NIO优化IO实现文件上传下载
Java使用NIO优化IO实现文件上传下载
774 0
|
安全 Linux 数据安全/隐私保护
几种常见的联网方式
这个世界的一切都可以数字化。无论是文字、 图像还是声音,每时每刻,都有无数的 “包裹”携带着一个个比特从世界的这头奔向另一头。这种疯狂的现象如今已经司空见惯,没有人能够完全离开它。网络是人类最伟大的发明之一,这使人类进入了一个全新的时代。
几种常见的联网方式