1.写一个java类,该类包含了需要调用的本地方法的描述,如:
package com.jose
public class Test {
public native long method1(String mess);
public native long method2(String mess);
static {
System.loadLibrary("TestImp");
}
}
其中TestImp.dl文件放在windows安装目录的system32下面,同时设置好classpath(.)
注意:一般情况下java类有放在包里和没有包两种情况。
2.提示符下使用命令javac -d . Test.java 编译上面写的java文件。
此时会生成相应的包的目录结构,并生成Test.class文件。
3.提示符下使用命令javah -jni com_jose_Test,此时会在当前目录下生成文件com_jose.Test.h文件,该文件是由包名+类名组成,中间用分隔符(_)隔开。
4.使用VC来编写本地方法的实现函数,最后编译成.dll文件
①选择new->projects(选择Win32 Dynamic-Link Library,以第一步中指定的库名TestImp作为工程名)->OK->An ampty DLL project->Finish
②选择Tools->Options->Directories 添加JNI所需的头文件
③将第三步生成的com_jose_test.h文件拷贝到TestImp工程中,并将其添加到TestImp.cpp的头文件中
注意事项说明:
㈠我们知道DLL有两种导出函数的方法,一种就是在.def文件中定义,另一种是在定义函数时使用关键字_declspec(dllexport)。而在JNI中函数定义关键字JNIEXPORT实际就在jni_md.h中如下定义:
#define JNIEXPORT_declspec(dllexport)
可见JNI默认的导出方式为第二种。使用第二种方式产生的导出函数名会根据编译器发生变化,在有的情况下会发生找不到导出函数的问题(我们在JSP中调用JNI的时候就发生这样的问题,后来强加一个.def文件重新导出函数就解决了)。因此最好还是自己定义个.def文件,强制导出的方法比较好点。
㈡根据本列,写一个TestImp.def文件,如下:
LIBRARY "TestImp"
DESCRIPTION 'ImageConvertDll Windows Dynamic Link Library'
EXPORTS;
Explicit exports can go here
Java_com_jose_Test_method1
Java_com_jose_Test_method2
最后生成dll文件