1、JNI定义(来自百度百科)
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
2、java通过JNI调用c++接口步骤
1)、创建java包、类
此处创建 包myJNI,类TestJNI
package myJNI; public class TestJNI { }
2)、在TestJNI类中创建native方法
此处创建sayHello()方法
package myJNI; public class TestJNI { public native void sayHello(); }
3)、通过javah命令生成C++需要用到的头文件
下面是我的java工程的目录结构:
|—eclipse_workspace
|—TestJNI
|—src
|—myJNI
|—TestJNI.java
——用命令行进入java工程所在的目录,进入到与src同级的目录即可
——用javah命令生成.h文件,因为TestJNI.java在包myJNI中,此时是在src目录下执行命令,所以加上加上包myJNI
——javah命令执行成功后,在执行命令的目录下(此处为src目录)生成.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class myJNI_TestJNI */ #ifndef _Included_myJNI_TestJNI #define _Included_myJNI_TestJNI #ifdef __cplusplus extern "C" { #endif /* * Class: myJNI_TestJNI * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_myJNI_TestJNI_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
4)、创建C++工程
——新建工程
——应用程序类型设置为DLL类型
——将前面生成的.h文件拷贝到C++工程,放到与.cpp同目录下
——将JDK安装目录include目录下的jni.h 和 include/win32目录下jawt_md.h和jni_md.h拷贝到VS安装目录下的VC/include目录下
——将C++工程中生成的dll文件拷贝到到环境变量path所包含的目录下,可以在环境变量中查看path所包含的目录
我的是将TestJNI.dll拷贝至D:\Program Files\Java\jdk1.7.0_17\bin中
——在C++工程中编写sayHello()方法
方法名必须与TestJNI.h中的方法名一致,否则出错
#include<iostream> #include"myJNI_TestJNI.h" JNIEXPORT void JNICALL Java_myJNI_TestJNI_sayHello(JNIEnv *env, jobject obj) { using namespace std; cout<<"hello world!"<<endl; }
5)、编写java程序,在java中调用C++的sayHello()接口
——System.loadLibrary("TestJNI")是加载dll文件,该文件名称必须为C++工程生成的dll文件名称;
——testJNI.sayHello()及调用C++实现的接口;
package myJNI; public class TestJNI { public native void sayHello(); public static void main(String[] args) { System.loadLibrary("TestJNI"); TestJNI testJNI = new TestJNI(); testJNI.sayHello(); } }
6)、运行java程序,打印结果为 hello world! 表明通过JNI调用C++接口成功。