JNI是Java Native Interface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C&C++)。在以下三种情况下会用到JNI:
- Java代码不存在相关功能API,例如java需要得到一个文件的属性。但是JDK中没有相关的API。
- 在本地还有一个别的系统,不过不是Java语言实现的,这个时候需要把两套系统整合到一起的时候。
- Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。
第一步,编写java声明类:
1.新建项目,新建HelloJava.class,包名为com.jni,代码如下:
- public class SayHellotoCPP {
- public SayHellotoCPP(){
- }
- public native void sayHello(String name);
- }
第二步,用javah编译HelloJava.class成.h文件
1.安装jdk,配置环境变量
2.在cmd中进入java项目的目录,输入 javah -jni com.jni.HelloJava
3.得到com_jni_HelloJava.h文件
第三步,编写C++实现代码的项目
1.用VC++新建Win32 Dynamic-Link library工程,并将得到的com_jni_HelloJava.h文件拷贝到工程下,com_jni_HelloJava.h中自动有 JNIEXPORT void JNICALL Java_com_chnic_jni_HelloJava_sayHello
(JNIEnv *, jobject, jstring)方法。
2.编写具体实现代码,在JNIEXPORT void JNICALL Java_com_chnic_jni_HelloJava_sayHello
(JNIEnv *, jobject, jstring)方法方法中加入“const char* pname = env->GetStringUTFChars(name, NULL);
cout << "Hello, " << pname << endl; ”
3.F7编译项目,在VC++MyProjects/HelloC/Debug目录下有dll文件。
4 把这个DLL放到windows下面的sysytem32文件夹下面,这个是windows默认的path(或者
- 复制你工程的Debug目录,我这里是C:/Program Files/Microsoft Visual Studio/MyProjects/HelloEnd/Debug这个目录,把这个目录配置到User variable的Path下面。重启eclipse,让eclipse在启动的时候重新读取这个path变量。
第四步,修改HelloJava.class代码
添加
- static{
- System.loadLibrary("HelloEnd");
- }
第五步,调用HelloJava类
- HelloJava shp = new HelloJava();
- shp.sayHello("World");