目录
第一篇: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
调用顺序:
- 编写带有native声明的方法的java类
- 编译所编写的java类
- 使用javah + java类名生成扩展名为h的头文件
- 将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

Java对象类型
java对象映射到c++中:

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

网友评论