没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
一:什么是JNI
JNi就是java调用本地方法的技术,最简单的来说,java运行一个程序需要要和不同的系统平台打交道,在windows里
就是和windows平台底层打交道,mac就是要和mac打交道,jvm就是通过大量的jni技术使得java能够在不同平台上
运行。
使用了这技术的一个标志就是native,如果一个类里的一个方法被native修饰,那就说明这个方法是jni来实现的,他是
通过本地系统api里的方法来实现的。当然这个本地方法可能是c或者C++,当然也可能是别的语言。jni是java跨平台
的基础,jvm通过在不同系统上调用不同的本地方法使得jvm可以在不同平台间移植。
如下图所示
上图中有一处不太严谨的地方,那便是(C/C++),如果是mac os那就不能说是C/C++了,但是在Android系统中我
们只能用C/C++。
1.1 Java和C/C++ 中的基本类型的映射关系:
JNI是接口语言,因而,会有一个中间的转型过程,在这个过程中,有一个非常重要的也是非常关键的类型对接方
式,这个方式便是,数据类型的转变,下表给出了相关的对于的数据格式。
下表中的数据为JNI基本数据类型及对应的长度
java类型 jni类型 描述
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat signed 32bit
double jdouble signed 64 bits
Class jclass class类对象
String jstring 字符串对象
Object jobject 任何java对象
byte[] jbyteArray byte数组
这个表都是JNI开发中 java 和 JNI之间数据的适配。
二:动态库和静态库
Android NDK种的动态库和静态库就是linux下的动态库和静态库,因为NDK的开发可以理解从基于Linux的开发。
在平时工作中我们经常把一些常用的函数或者功能封装为一个个库供给别人使用,java开发我们可以封装为jar包提供
给别人用,安卓平台后来可以打包成aar包,同样的,C/C++中我们封装的功能或者函数可以通过静态库或者动态库
的方式提供给别人使用。
Linux平台静态库以.a结尾,而动态库以.so结尾。
要分析链接库首先要分析交叉编译
2.1什么是交叉编译?
交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或
者linux系统上编译出可在安卓系统上运行的可执行文件,什么时候需要用到交叉编译呢?音视频开发基本都会用到
ffmpeg,opengl es等三方库,这时我们就需要在window或者mac或者linux系统上编译出可在安卓系统执行的文
件,这里可编译出静态库或者动态库使用,这时候就会用到交叉编译。
交叉编译的目的很清楚,就是编译出除了自己平台意外其他平台可以用的库的过程。那么在Android 平台的代码,
由于Android平台是基于linux,因此很多Android 中可以运行的库就是在linux中编译的,或者是在mac上面编
译,而在windows上面编译就比较难了。那么到底什么是动态库和静态库呢?
2.2 动态库和静态库(共享库)
2.2.1 静态库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标
代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译
进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2.2.2 动态库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序
执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整
合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并
不影响你的程序,所以动态函数库的升级比较方便
静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大;动态库(共享库)的代码在可执行程序运行时才载
入内存,在编译过程中仅简单的引用,因此代码体积比较小。
2.3 Android如何配置cmakelist.txt 配置编译动态库和静态库呢?
三 JNI 动态注册与静态注册
3.1. 静态注册
步骤:
1)编写java类,假如是JniTest.java
2)在命令行下输入 javac JniTest.java 生成JniTest.class文件
3) 在 JniTest.class 目录下 通过 javah xxx.JniTest(全类名)生成 xxx_JniTest.h 头文件
4)编写xxx_JniTest.c 源文件,并拷贝xxx_JniTest.h 下的函数,并实现这些函数,且在其中添加jni.h头文件;
5)编写 cmakelist.txt 文件,编译生成动态/静态链接库
3.2. 动态注册:
在此之前我们一直在jni中使用的 Java_PACKAGENAME_CLASSNAME_METHODNAME 来进行与java方法的匹配,这
种方式我们称之为静态注册。
而动态注册则意味着方法名可以不用这么长了,在android aosp源码中就大量的使用了动态注册的形式
add_library(jinInterface SHARED library.c library.h)// SHARED 表示是动态库
add_library(jinInterface STATIC library.c library.h)// STATIC 表示是静态库
ADD_LIBRARY(...)
语法:ADD_LIBRARY(libname [SHARED|STATIC] )
上面的表达式等同于:
set(LIB_SRC library.c library.h)
add_library(jinInterface SHARED ${LIB_SRC})
剩余15页未读,继续阅读
点墨楼
- 粉丝: 32
- 资源: 281
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于UC3842+LTS26Q1565A设计PC机充电器 硬件(原理图+PCB)工程文件.zip
- Hive SQL经典面试题,大数据SQL经典面试题
- Qt实现喷码器代码,实现二维码、条形码、图形的旋转、移动等
- 基于LM324芯片比较器传感器模块AD09设计硬件(原理图+PCB)工程文件.zip
- HTTP请求 - 记一笔-添加记账.jmx
- 2205040245凡永超硬间隔svm.ipynb
- Qt喷码器demo,演示软件,不是代码
- 目标跟踪-基于目标中心点同时进行目标检测+目标跟踪算法实现-项目源码-优质项目实战.zip
- Python《文本特征分析-全唐诗数据挖掘及分析 》+源代码
- Netron-Setup-4.5.0
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0