一、 生成C的头文件
1. 编辑 Main.java
public class Main
{
public native static int getStrNum(byte str[],int strLen);
}
2. 生成头文件
按 win + r 打开 “ 运行 ” 窗口,输入 “cmd” ,打开 DOS 控制台窗口。进入上面 Main.java 所在的目录中,输入:
javac Main.java
javah Main
两条命令完成后会生成 Main.h 文件
二、 生成DLL
1. 新建空工程
在 VS 中新建工程: Win32 Console Application ,取名 “MakeDLL” ,选择空工程。新建后修改工程属性:
(1) General 中,将 “Configuration Type” 改为 “Dynamic Library(.dll)” ;
(2) C/C++ 的 General 中,将 “Additional Include Directories” 添加两项:
“C:Program FilesJavajdk1.5.0_06include”
“C:Program FilesJavajdk1.5.0_06includewin32”
根据你安装的 JAVA 路径而设置,这是因为在 C/C++ 编译过程中要使用 JAVA 的 jni.h 等文件
2. 将上面生成的 Main.h 添加入工程
3. 新建一个新的文件 main.cpp ,代码如下:
#include ’Main.h’
#include ’string.h’
JNIEXPORT jint JNICALLJava_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
{
jbyte *buffer = (*env).GetByteArrayElements(str,0);
buffer[strLen] = ’’; // 由于 JAVA 自动分配空间,需要传进来字符串长度参数
jint len = strlen((char*)buffer);
return len;
}
4. 按 F7 编译链接,生成 MakeDLL.dll 文件
三、 JAVA调用DLL
在 JAVA 中使用上面生成的 DLL 文件:
1. 将 MakeDLL.dll 复制到与使用 DLL 的 JAVA 文件相同的目录下。
2. JAVA 文件的源代码:
public class Main
{
static
{
System.loadLibrary(’MakeDLL’);
}
public native static int getStrNum(byte str[],int strLen);
public static void main(String[] args)
{
Main instance = new Main();
String str = new String(’haha’);
int num = instance.getStrNum(str.getBytes(),str.length());
System.out.println(num);
}
}
总结:
另外, JAVA 与 DLL 函数的参数传递过程,考试 , 大提示像 int 类型的,可以直接从 JNI 函数参数列表中获取;而数组元素则要通过 JNIEnv 来获取:
jbyte *buffer = (*env).GetByteArrayElements(str,0); // str 是参数列表中 jbyteArray 变量
同理可以获取 char[] 的元素。
函数返回时,可以直接用 return 语句返回。也可以设置参数列表中的变量指针来返回:
(*env).SetByteArrayRegion(byteArray, 0, 128,byteArr);
byteArray 是参数列表中的 jbyteArray 变量,作为指针用来返回需要返回的信息; byteArr 是 jbyte* 类型,里面存放的值是要返回的内容。
其它的信息可以从 Google 或 Baidu 中通过查找 “jni” 或 “java 调用 DLL” 来查阅到。
1. 编辑 Main.java
public class Main
{
public native static int getStrNum(byte str[],int strLen);
}
2. 生成头文件
按 win + r 打开 “ 运行 ” 窗口,输入 “cmd” ,打开 DOS 控制台窗口。进入上面 Main.java 所在的目录中,输入:
javac Main.java
javah Main
两条命令完成后会生成 Main.h 文件
二、 生成DLL
1. 新建空工程
在 VS 中新建工程: Win32 Console Application ,取名 “MakeDLL” ,选择空工程。新建后修改工程属性:
(1) General 中,将 “Configuration Type” 改为 “Dynamic Library(.dll)” ;
(2) C/C++ 的 General 中,将 “Additional Include Directories” 添加两项:
“C:Program FilesJavajdk1.5.0_06include”
“C:Program FilesJavajdk1.5.0_06includewin32”
根据你安装的 JAVA 路径而设置,这是因为在 C/C++ 编译过程中要使用 JAVA 的 jni.h 等文件
2. 将上面生成的 Main.h 添加入工程
3. 新建一个新的文件 main.cpp ,代码如下:
#include ’Main.h’
#include ’string.h’
JNIEXPORT jint JNICALLJava_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
{
jbyte *buffer = (*env).GetByteArrayElements(str,0);
buffer[strLen] = ’’; // 由于 JAVA 自动分配空间,需要传进来字符串长度参数
jint len = strlen((char*)buffer);
return len;
}
4. 按 F7 编译链接,生成 MakeDLL.dll 文件
三、 JAVA调用DLL
在 JAVA 中使用上面生成的 DLL 文件:
1. 将 MakeDLL.dll 复制到与使用 DLL 的 JAVA 文件相同的目录下。
2. JAVA 文件的源代码:
public class Main
{
static
{
System.loadLibrary(’MakeDLL’);
}
public native static int getStrNum(byte str[],int strLen);
public static void main(String[] args)
{
Main instance = new Main();
String str = new String(’haha’);
int num = instance.getStrNum(str.getBytes(),str.length());
System.out.println(num);
}
}
总结:
另外, JAVA 与 DLL 函数的参数传递过程,考试 , 大提示像 int 类型的,可以直接从 JNI 函数参数列表中获取;而数组元素则要通过 JNIEnv 来获取:
jbyte *buffer = (*env).GetByteArrayElements(str,0); // str 是参数列表中 jbyteArray 变量
同理可以获取 char[] 的元素。
函数返回时,可以直接用 return 语句返回。也可以设置参数列表中的变量指针来返回:
(*env).SetByteArrayRegion(byteArray, 0, 128,byteArr);
byteArray 是参数列表中的 jbyteArray 变量,作为指针用来返回需要返回的信息; byteArr 是 jbyte* 类型,里面存放的值是要返回的内容。
其它的信息可以从 Google 或 Baidu 中通过查找 “jni” 或 “java 调用 DLL” 来查阅到。