Android底层调用C代码(JNI实现)



Android底层调用C代码(JNI实现)

  • 一、基础知识
  • 二、从Android框架角度简单分析JNI
  • 三、标准JNI实现步骤
  • 四、实现JNI过程实例

一、基础知识

1、JNI:百度百科中解释:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
(然而就像官话一样难理解)。
个人理解,JNI就是一个可以通过Java虚拟机(JVM)执行C/C++代码的接口,有了JNI,就可以在Android应用中与其他语言写的程序代码进行交互。。可以说是Android最重要的一个功能接口,

2、NDK:Native Development Kit 的缩写,如英文意思,是Android提供的一套工具,重点是包含实现JNI功能的一些命令


二、从Android框架角度简单分析JNI

这里写图片描述

(专业盗图)
其中Application层和Firmware层都是Java代码编写,而底层众多Libararies、Kernel和一系列驱动程序都是C/C++代码写的,
因此上层Java要调用底层的C/C++函数库必须通过JNI来实现,可以说JNI是底层到App层的一个桥梁。

有兴趣了解各层次可以看下面分层描述:(从我以前大论文摘的,终于用上一次了!)
(1)操作系统内核层(Kernel)
Android系统基于Linux内核作为整个系统的基础核心,依托Linux内核强大的内存管理、进程控制、网络管理以及安全管理等能力,使得Android系统的整体性能得到提升;Google公司针对移动设备的特点,基于Linux驱动模型添加了移动设备中常用的驱动程序,例如音频驱动、摄像头驱动等,极大提升了系统的可扩展性。Linux内核之上,Linux内核也同时作为软件层之下的硬件抽象层(Hardware Abstract Layer),负责对Linux内核驱动程序的封装,并向上提供接口。

(2)核心库(Libraries)与运行环境层(Android Runtime)
该层的核心函数库都与移动设备平台的应用密切相关,其中大部分都是基于C/C++语言,通过使用Java提供的JNI(Java Native Interface)接口Android上层应用使用,方便应用程序开发与维护。Android基于Dalvik虚拟机技术实现系统运行环境,具有较好的硬件优化能力,更加适合移动设备领域应用。

(3)应用框架层(Application Framework)
应用框架是Android应用开发的基础,为开发人员提供各种API接口;该层首先实现了Android应用程序中的各种组件,并且在遵循框架安全限制的前提下,任何应用程序之间都可以相互发布其功能并使用,使得应用程序开发更加便捷。

(4)应用层(Application)
Android应用层包括在系统上运行的应用程序,还包括安装在设备上的第三方应用,第三方应用的开发都是基于Android提供的SDK工具包(Software Development Kit),并且都是使用Java语言编程;开发人员可以利用Android应用框架层进行应用程序的开发,也可以绕过框架层直接使用NDK(Native Development Kit)进行开发。


三、标准JNI实现步骤

准备工作:首先要下载NDK,然后配置环境变量,如果用Android Studio ,需要添加NDK目录到Local.properties,并且在App目录中添加so名字到Build.gradle

步骤如图:
这里写图片描述

一般步骤都是要先编写Java 类代码,里面定义Native方法名;
编译后,通过NDK中的Javah命令生成接口文件xxx.h,之后就可以用C/C++语言实现各类方法,并且编译生成的libxxx.so文件,供上层调用。


四、实现JNI过程实例

第一步:创建Java类,其中的方法需要用native关键字修饰,例如。

这里写图片描述

其中,Java代码加载JNI的库是调用System.loadlibrary方法加载,这里的mms库就是编译的 一个C动态链接库,是 通过NDK-build进行比哪一 然后包含进行app代码中如下:

这里写图片描述

第二步:使用javah命令(javah 类的全路径)生成本地方法的C++头文件.h

这里写图片描述

这一步会自动生成Native方法对应的接口函数,如 生成com_xxxx_finaltest_NativeMocana.h里面就是test的接口函数

这里写图片描述

第三步:编写C/C++本地代码,Rebuild 生成动态链接库文件 libmms.so

这里写图片描述

第四步 :Java调用本地函数,实现对底层C代码的调用。

这里写图片描述


附更改Android Studio JDK、SDK、NDK路径方法:

这里写图片描述


博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


在这里插入图片描述

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android JNI是一种可用于在Java代码调用C/C++代码的技术,驱动ko则是指内核模块文件,通常用于实现与硬件设备的交互。在Android应用中,我们可以使用JNI调用驱动ko,实现底层硬件的交互。 要在Android应用中调用驱动ko,首先需要在应用中使用JNI技术编写C/C++代码实现与驱动ko的交互逻辑。在C/C++代码中,我们可以通过使用Linux系统提供的API来访问并且控制驱动ko。通过JNI,我们可以将C/C++代码嵌入到Java代码中,并在Android应用中调用这些代码。 具体来说,调用驱动ko的过程如下: 1. 在JNI层编写与驱动ko交互的C/C++代码。这些代码可以使用Linux系统提供的ioctl函数等API来与驱动ko进行通信,并发送相应的指令和数据。 2. 在Java层编写对应的JNI接口和方法。这些方法将与JNI层的C/C++代码进行绑定,以便在Java代码调用这些方法来间接调用驱动ko。 3. 在Java代码中加载JNI库,并调用JNI接口方法。加载JNI库可以使用System.loadLibrary方法,然后在Java代码中就可以调用JNI接口方法,进而间接调用驱动ko。 通过这种方式,我们可以在Android应用中通过JNI技术调用驱动ko,实现底层硬件的交互。注意,使用JNI调用驱动ko需要确保设备具备相应的权限,否则可能会出现权限不足的错误。同时,也需要确保驱动ko文件存在于系统中,并且可以被应用访问到。 总之,使用Android JNI可以实现在应用中调用驱动ko文件的功能,通过编写C/C++代码并与Java代码进行绑定,实现底层硬件交互的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值