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

时间:2024-04-09 14:47:20

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

Android底层调用C代码(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

步骤如图:
Android底层调用C代码(JNI实现)

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


四、实现JNI过程实例

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

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

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

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

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

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

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

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

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

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

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

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


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

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

欢迎转载,Howie原创作品,本文地址:

http://blog.csdn.net/HowieXue/article/details/76714314

谢谢