一、jni介绍
JNI是java Native Interface的缩写,它是Java平台的一个特性(并不是Android系统特有的)。其实主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点了。一般情况下我们首先是将写好的C/C++代码编译成对应平台的动态库(windows一般是dll文件,linux一般是so文件等)。
JNI可以这样与本地程序进行交互:
1、你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。
2、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。
二、实例(Java和C++为例)
1、首先在java中定义native方法:
hello和add方法用来简单演示jni技术,callback用来演示在C++中回调java方法。
2、使用javah命令生成native方法的头文件
javah com.cg
生成头文件
3、新建c++工程,使用Visual Studio创建项目
创建项目
选择dll和空项目
将JNI生成的头文件引入进来:
引入头文件
将jdk中的jni.h和jni_md.h这2个头文件引入C++项目,这2个头文件是编译生成dll所必须的。
实现头文件,新建一个cpp源文件:
然后编译生成dll,将dll拷贝到工程根目录下,或者加dll所在的文件路径加入到系统path路径下。
运用java程序调用dll结果如下:
三、使用注意实现
1、dll版本要和java程序版本一致,都是32位或都是64位。
2、jni关于java方法的签名:
观察下面四个方法对应的签名
public void test(){} ()V
public void test1(int i){} (I)V
public int test2(){ return 1;} ()I
public int test3(int i) { return i;} (I)I
由此可以看出:签名是由两部分组成,"()" 里面代表的是方法的参数,后面外面的部分代表的是该方法的返回值
关于这两部分的定义其实又有分 基本数据类型 和 引用数据类型
基本数据类型对应关系如表:
引用数据类型:比较麻烦点,以“L”开头,以“;”结束,中间对应的是该类型的路径
如:String : Ljava/lang/String;
Object: Ljava/lang/Object;
自定义类 Cat 对应 package com.duicky;
Cat : Lcom/duicky/Cat;
数组表示: 数组表示的时候以“[” 为标志,一个“[”表示一维数组
如:int [] :[I
Long[][] : [[J
Object[][][] : [[[Ljava/lang/Object;
JNI的使用方法还有很多种,这里只是例举了部分。有兴趣的小伙伴,可以上网查询资料学习下,欢迎相互交流学习。