1、调用原理
用java的javah命令将java native 方法编译成.h,在C程序中调用此.h文件,并实现.h文件里面声明的方法,编译生成.dll文件,最后java通过System.loadLibrary()加载.dll文件,调用具体的方法实现;
2、具体操作步骤:
1、编译JAVA类
1public class TestJNI { 2 // 加载编译好的.dll文件 3 static 4 { 5 System.loadLibrary( "VsDll" ); 6 } 7 // 声明调用C的方法名称,注意用native修饰 8 public native static int cToJava(); 9 // 测试是否配置成功 10 public static void main(String[] args) { 11 System.out.println(cToJava()); 12 } 13}
2、执行生成.h文件的命令
1// 进入cdm,cd 到项目目录 2// 生成.class文件 3 javac TestJNI.java 4// 生成.h文件 5 javah TestJNI 6// 生成文件如下: 7/* DO NOT EDIT THIS FILE - it is machine generated */ 8#include <jni.h> 9/* Header for class TestJNI */ 10 11#ifndef _Included_TestJNI 12#define _Included_TestJNI 13#ifdef __cplusplus 14extern "C" { 15#endif 16/* 17 * Class: TestJNI 18 * Method: cToJava 19 * Signature: ()I 20 */ 21JNIEXPORT jint JNICALL Java_TestJNI_cToJava 22 (JNIEnv *, jclass); 23 24#ifdef __cplusplus 25} 26#endif 27#endif
3、在Visual Studio中创建VsDll项目
11、创建dll项目参考:http://jingyan.baidu.com/article/ff411625ad116612e48237a4.html 2 3 2、新建一个.cpp文件 4 #include "jni.h" 5 #include "TestJNI.h" 6 JNIEXPORT jint JNICALL Java_TestJNI_cToJava 7 (JNIEnv *, jclass){ 8 return 1; 9 }
4、将生成的.dll文件拷贝到java项目下
1// 配置.dll文件访问路径,以idea为例 2// 在项目路径下新建一个lib文件夹将生成的.dll文件拷贝到此文 3//件夹下面,并在VM中配置此参数: 4 -Djava.library.path=E:\javaProject\lib
3、注意事项
- 1、需要将java安装目录下**\Java\jdk1.8.0_60\include 里面的jni.h ,以及**\Java\jdk1.8.0_60\include\win32目录下的jni_md.h拷贝到vs项目的目录下
- 2、修改生成的TestJNI.h文件里面对jni.h的引用形式为: #include "jni.h",
- 3、修改在.cpp文件里面对jni的引用格式也为:#include "jni.h"
- 4、注意VS的编译器和JDK的编译要对应,比如: VS用x64,JDK是64位的,如果VS是32,JDK是64,则需要修改VS的 解决方案平台,具体参考:http://blog.csdn.net/zhounanzhaode/article/details/50322841