一编写Java程序

publicclassNativeMethodTest{
//编写一个本地方法
publicnativevoidsayHello();
//用类System加载动态链接库

//其中一个是相对地址加载默认根据path路径加载另外一个绝对路径来加载
static{
/*Loadsacodefilewiththespecifiedfilenamefromthelocalfile
systemasadynamiclibrary.Thefilename
argumentmustbeacompletepathname.*/
//System.load("C:/mycl/mycl/test.dll");
System.loadLibrary("test");

publicstaticvoidmain(String[]args)

//像其它方法一样调用本地方法

newNativeMethodTest().sayHello();
//查看java.library.path变量路径
System.out.println(System.getProperty("java.library.path"));
}
}

二编译Java文件

三根据编译的.class文件生成扩展名为h的头文件
classe根目录下(这个需要全包名才可以)
如javah-jnicom.buaa.testjni.NativeMethodTest

生成的文件内容如下

头文件的内容:

/*DONOTEDITTHISFILE-itismachinegenerated*/
#include<jni.h>
/*HeaderforclassNativeDemo_NativeMethodTest*/

#ifndef_Included_NativeDemo_NativeMethodTest
#define_Included_NativeDemo_NativeMethodTest
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:NativeDemo_NativeMethodTest
*Method:sayHello
*Signature:()V
*/
JNIEXPORTvoidJNICALLJava_NativeDemo_NativeMethodTest_sayHello(JNIEnv*je,jobjectjo);

#ifdef__cplusplus
}
#endif
#endif

注意:源文件参数(JNIEnv*,jobject);需要改成(JNIEnv*je,jobjectjo);

(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)

四根据.h文件编写HelloWorld.c文件

/*DONOTEDITTHISFILE-itismachinegenerated*/
#include"NativeDemo_NativeMethodTest.h"

JNIEXPORTvoidJNICALLJava_NativeDemo_NativeMethodTest_sayHello
(JNIEnv*je,jobjectjo){
printf("HelloWorld");
return;
}

另外需要将NativeDemo_NativeMethodTest.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将NativeDemo_NativeMethodTest.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为NativeDemo_NativeMethodTest.c可以了

五根据上面两个文件生成动态链接库(VC编译器)

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,

使用VC的编译器cl命令。
cl-I%java_home%\include-I%java_home%\include\win32-LDHelloWorldImp.c-Fetest.dll
注意:生成的dll文件名在选项-Fe后面配置,

另外需要将-I%java_home%\include-I%java_home%\include\win32参数加上,

因为在第四步里面编写本地方法的时候引入了jni.h文件。-I后面跟的路径是JDK中.h文件路径

用VS生成有可能需要VS中的其它.h文件和LIB链接将所需的文件也拷贝入对应的目录下

六执行

执行本地方法时一定要先加载对应的动态链接库

这一般有两种方法

1通过System.load(绝对路径)System.loadLibrary("test");加载

2通过添加执行参数来加载Java-Djava.library.path[dll文件路径]

调用本地方法和Java中的其它方法没有区别