调用带非字符类型,如整型(int),可参照下列,如为字符或字符串,阅读全文。
DOS环境下:
Java文件准备:
HelloNative.java
public class HelloNative {
public native static void greeting();
static
{
System.loadLibrary("HelloNative");
}
}
这个文件建好以后,先启动一个DOS窗口,按照下面步骤执行(注意,执行下面步骤,必须保证与Java源文件在同一目录下):
-
-
编译:javac HelloNative .java //生成HelloNative.class
-
生成DLL函数所需头文件(HelloNative.h):javah -jni HelloNative
-
HelloNative.h内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif
测试文件:
HelloNativeTest.java
class HelloNativeTest
{public static void main(String[] args)
{
new HelloNative().greeting();
}
}
编译生成执行类文件。
创建DLL:
启动VC6.0,按以下步骤执行:
新建工程:File ---> New ---> Projects ---> Win32 Dynamic-Link Library 然后输入新建工程名称,最好是保持与要建的DLL
名字一样(这是第一次做,小心为上,随便起名,与DLL不同不知道会不会有问题,改天再试),然后选择 OK ,出现下
一个选择面板,选择 An empty dll project. ,然后直接点 Finish ,工程新建完毕。
环境准备:找到Java的安装目录下的 include目录(路径参照 D:/Program Files/Java/jdk1.6.0_20/include/ )将这个目录下的全部文件复制到VC6.0的安装目录下的 include目录下(路径参照 D:/Program Files/Microsoft Visual Studio/VC98/Include/ ),然后将D:/Program Files/Java/jdk1.6.0_20/include/ win32下的内容再复制到D:/Program Files/Microsoft Visual Studio/VC98/Include/下(这里出现了双份的jawt_md.h和jni_md.h拷贝,编译的事情,这里不具体研究,出问题再说),这些完成后,把Java代码准备时生成的DLL头文件 HelloNative.h 添加到上一步新建的DLL工程中,然后再新建一个DLL程序文件 HelloNative.c
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)
{
printf("Hello Native World!/n");
}
新建完成后,执行 Build ---> Build HelloNative.dll (或者按F7) 生成测试用的DLL文件
然后将DLL文件拷贝到测试用Java程序的执行类(*.class)所在文件下,这个练习是放到HelloNative.class和HelloNativeTest.class所在目录下,然后进入DOS窗口,执行 java HelloNativeTest(回车),就可以看到输出结果了。
如果是在MyEclipse工程中,需要进行下述操作:
将VC工程生成的DLL文件放到工程 bin目录下,这个练习是将 HelloNative.dll 放到 bin 目录下。
找到菜单 Run ---> Open Run Dialog... ---> Java Application(选项卡) ,在这个选项下边,会有对应于要调用DLL工程的一个选项,点进这个选项,在详细设定面板中选择 (x)=Arguments 这个选项卡,在里有一个文本输入的项目叫 VM arguments ,在里面输入 " -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin" ,然后点 Run 按钮,然后就可以执行程序了。
注意,这里的" -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin",不能在程序中用System.Setproperty()设定,因为java.library.path这个属性只在JVM启动的时候读取一次,所以,程序中的任何相关设定都是不起作用的。
HelloNative.java 这种中间类不能放在包里面,就是不能指定package。
调用带字符串参数的DLL
带字符串参数的DLL调用必须借助每三方接口,确切的说,就是在要调用的DLL上再加一层接口,下述说明参照。
上述使用例程修正如下:
HelloNative.java
public class HelloNative {
//这里对应的DLL接口定义为void greeting(char *str),这么定义是因为Java和C使用的是不同的字符集标准
//C是ANSI,Java是UTF-16(这个我也是查资料,没弄的太明白,可能有误,不过基本是这么个意思)
public native static void greeting(byte[] str,int strLength);
static
{
System.loadLibrary("HelloNative");
}
}
参照无参的HelloNative.java的说明,生成HelloNative.h头文件。
HelloNativeTest.java
class HelloNativeTest
{
public static void main(String[] args)
{
String str = new String("Hello Native World!/n");
new HelloNative().greeting(str.getBytes(),str.length());
}
}参照无参例子,新建动态链接库工程,生成DLL文件,然后将DLL放到system32下,放到别的地方也可以,不过要将你放的路径设置到系统环境变量 path 里,这样就不用运行Java的时候,总是去设定 java.library.path 这个JVM属性了。到这里,生成的是可以供windows调用的DLL。下面是参照代码:
如果是编译位于包路径下的中间件接口,使用如下格式命令
生成类文件:javac xxx.java
生成编译DLL所需头文件:javah -jni -classspath 包路径。类名(com.XXX.util.xxx)
转自:
http://51170526.blog.163.com/blog/static/73633350201052452742369/