美文网首页
什么是JNI?

什么是JNI?

作者: 面向星辰大海的程序员 | 来源:发表于2020-04-10 23:49 被阅读0次

学习记录:

什么是JNI?

1.Java Native Interface Java本地接口,

2.Java层调用本地C,C++等

3.JNI是Java调用本Native语言的一种特性,与Android无直接关系

4.实际中的驱动都是C/C++开发的,通过JNI,Java可以调用C/C++实现的驱动,从而扩展Java虚拟机的能力。另外,在高效的数学运算、游戏的实时渲染、音视频的编码和解码等方面,一般都是用C开发的。

为什么要有JNI?

Java具备跨平台,面向对象方面的特点,语言特点相对于C更偏向与人的使用和编写,所以相对于C,Java与计算机的交互效率更低,执行效率使用C更好,一些系统相关的操作JVM无法完成,通过JNI条用C等弥补这个缺陷,更完善了Java,故而有JNI。

实现JNI的手段:NDK

1.在Java中声明Native方法(即需要调用的本地方法)

2.编译上述Java源文件(得到.class文件)

3.通过javah命令到户JNI的头文件(.h文件)

4.使用Java需要交互的本地代码,实现在Java中生命的Native方法

5.编译.so库文件

6.通过Java命令执行Java程序,最终实现Java调用本地代码

NDK(NDK(C/C++)SDK(Java)性质是一样的)

1.定义:Native Development Kit,是Android的一个工具开发包

2.作用:快速开发C、C++的动态库、并自动将so和应用一起打包成apk

3.在Android的场景下使用JNI

4.提供了把.so和.apk打包的工具

5.NDK提供的库有限,仅拥有算法效率和敏感的问题

6.提供了交叉编译器,用于生特定的Cpu平台动态库

特点:1.运行效率高 2.代码安全性高 3.功能拓展性好 4.易于代码复用和移植

常用C/C++编译器

clang:是一个C、C++、Object-C的轻量级编译器。基于LLVM(LLVM是以C++编写而成的架构编译器的的框架系统,可以说是一个用于开发编译器相关的库)

gcc:GNU  C编译器。原本只能处理C语言,很快扩展,变得可以处理C++。

g++: GNU C++编译器,后缀为.c的源文件,gcc把它当作是C程序,而g++当作是C++程序,后缀为.cppd的,两者都会认为是c++程序,g++会自动链接C++标准库stl,gcc不会,gcc不会定义__cplusplus宏,而g++会

GDB:是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具

C/C++文件编译过程

预处理:预处阶段主要处理include和define等。它把#include包含进来的.h文件插入到#include所在的位置,把源程序中使用到的用#define定义的宏用实际的字符串代替

编译:编译阶段,编译器检查代码的规范性、语法错误等,检查无误后,编译器把代码翻译成汇编语言

汇编:汇编阶段,把.s文件翻译成二进制机器指令文件.o,这个阶段接收.c,.i,.s的文件都没有问题

链接:链接阶段:链接的是其余的函数库,比如我们自己编写的C/C++文件中用到了三方的函数库,在链接阶段就需要链接三方函数库,如果链接不到就会报错

静态库(static library .a)

通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数被称为静态库(static library),通常文件名为"libxxx.a"的形式,Android可以使用静态库。

动态链接库(dynamic link library .so)

对一些函数库的链接载入推迟到程序运行时期(runtime),可以实现进程之间的资源共享,将一些程序升级变得简单,甚至可以真正做到链接载入完全程序员在程序代码中控制。

本地编译

在当前编译平台下,编译出来的程序只能放到当前平台下运行,比如,在x86平台上编写程序并使用工具编译成在x86上可执行程序。这个编译过程称为本地编译。

交叉编译

在当前平台下,编译成其他平台可执行,但自身平台却不能执行,这个编译称为交叉编译

CMAKE手册

https://www.zybuluo.com/khan-lau/note/254724

Makefile 语法详解

https://quanzhuo.github.io/2016/06/06/Makefile/

字长

字长是Cpu的主要技术指标之一,指的是Cpu一次最大能并行处理的二进制位数,现在主流的计算机字长是32位和64位

原码、反码、补码(二进制)

正数:原码、反码、补码均相同

负数:原码(最高为1表示符号为)  反码(原码基础上,符号位不变,其他位取反)补码(反码基础上+1)

如  十进制-2对应的二进制的原码(32位)  1000 0000 0000 0000 0000 0000 0000 0010

                                             反码  1111 1111  1111 1111 1111 1111 1111 1101

                                             补码   1111 1111  1111 1111 1111 1111 1111 1110

计算机通常保存补码

数据类型

字符:char  储值大小:1字节  值范围:-128到127或0到255,1字节8位 ,无符号最小值 0000 0000(十进制=0) 最大值1111 1111  (十进制=255),有符号最大值0111 1111(十进制=127) 最小值1111 1111(十进制=-127),特殊1000 0000(-0)  0000 0000(+0)正负0中正0表示0二进制十进制都吃得消都代表0,没得表示了所以变成了-128(总个数都是256)。程序输出无符号时4294967168是按32位算的值

整形:int  储值大小:2字节或4字节  值范围-32768到32767或-2147483648到2147483647

长整形:long   储值大小:4字节

短整型:short 储值大小:2字节 

浮点型:float储值大小:4字节       double储值大小:8字节      long double储值大小:16字节

构造类型

数组 结构体(struct) 共用体(union) 枚举(enum)

指针 

void

相关文章

  • 使用JNI(Java Native Interface)的总结

    目录 什么是JNI?为什么使用JNI?怎么使用JNI?在IntelliJ IDEA里使用JNI 1. 什么是JNI...

  • Android JNI开发

    Android JNI开发 什么是JNI?有什么用? JNI是Java Native Interface的缩写,它...

  • JNI入门了解

    什么是JNI? JNI Java Native Interface java本地接口 JNI 能够解决什么问题? ...

  • JNI 基础知识

    JNI 基础知识 什么是 JNI ? JNI (Java Native Interface) 是 Java 沟通 ...

  • Android-JNI的简单使用

    一、什么是JNI 1、jni的含义 JNI即为java native interface Java本地接口;JNI...

  • JNI 开发详解

    JNI 是什么? JNI 是 Java Native Interface的缩写,意思是 Java本地接口,JNI ...

  • Android JNI开发

    一、什么是jni JNI java native interface native本地 java本地接口通过JNI...

  • JNI之路径初探---1

    首先要明白,什么是JNI,我们做安卓开发为什么要学习JNI,学习JNI能干嘛?JNI全称Java Native I...

  • JNI开发——基本实现

    jni 全名是java native interface。 JNI资料 什么时候使用JNI: 1、 java...

  • NDK--JNI开发

    使用JNI与Native code通信 什么事JNI? JNI是Java native interface的缩写,...

网友评论

      本文标题:什么是JNI?

      本文链接:https://www.haomeiwen.com/subject/slxjmctx.html