美文网首页程序员技术栈Android开发程序员
Android系统JNI使用(JAVA调用C语言接口)一

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

作者: Lee_5566 | 来源:发表于2019-01-23 20:39 被阅读4次

目录

第一篇: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

image.png

Java对象类型

java对象映射到c++中:


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

image.png

参考

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

相关文章

网友评论

    本文标题:Android系统JNI使用(JAVA调用C语言接口)一

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