Android系统JNI使用(JAVA调用C语言接口)一

目录

第一篇:Android系统JNI使用(JAVA调用C语言接口)一

什么是JNI

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信主要是C/C++。

从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。

使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。

例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

JNI的演化

JDK1.0包含了一个本地方法接口,它允许JAVA程序调用C/C++写的程序,许多第三方的程序和JAVA类库。如:java.lang,java.io,java.net等都依赖于本地方法来访问底层系统环境的特征。

不幸的是,JDK1.0中的本地方法有两个主要问题:

1、本地方法想访问C中的结构(structures)一样访问对象中的字段。尽管如此,JVM规范并没有定义对象怎么样在内存中实现。如果一个给定的JVM实现在布局对象时,和本地方法假设的不一样,那你就不得不重新编写本地方法库。

2、因为本地方法可以保持对JVM中对象的直接指针,所以,JDK1.0中的本地方法采用了一种保守的GC策略。

JNI的诞生就是为了解决这两个问题,它可以被所有平台下的JVM支持:

(1)每一个JVM实现方案可以支持大量的本地代码。

(2)开发工具作者不必处理不同的本地方法接口。

(3)本地代码可以运行在不同的JVM上面。

JDK1.1中第一次支持JNI,但是,JDK1.1仍在使用老风格的本地代码来实现JAVA的API。这种情况在JDK1.2下被彻底改变成符合标准的写法。

如何使用JNI

调用顺序:

  1. 编写带有native声明的方法的java类
  2. 编译所编写的java类
  3. 使用javah + java类名生成扩展名为h的头文件
  4. 将C/C++编写的文件生成动态连接库

Java基本数据类型与C语言基本数据类型的对应

Java Type JNI Type C Type 描述
boolean jboolean unsigned char unsigned 8 bits
byte jbyte signed char signed 8 bits
char jchar unsigned short unsigned 16 bits
short jshort short signed 16 bits
int jint long signed 32 bits
long jlong _int64 signed 64 bits
float jfloa float 32 bits
double jdouble double 64 bits

通过源码学习,让我们直观的看下源码中是怎么定义的:
libnativehelper/include_jni/jni.h

11345863-a79ae490108c9ea0.png
image.png

Java对象类型

java对象映射到c++中:


11345863-78332f07fcc33d92.png

所有的_j开头的类,都是继承于_jobject,这也是Java语言的特别,所有的类都是Object的子类,这些类就是和Java中的类一一对应,只不过名字稍有不同而已。

11345863-3a9b4cd91fb74b51.png
image.png

参考

JNI 学习笔记
JNI介绍
一天掌握Android JNI本地编程 快速入门
JNI 入门教程

猜你喜欢

转载自blog.csdn.net/weixin_34355715/article/details/87449869
今日推荐