首先,建立一个类。
package jniTest;
public class TestDLL {
public native int add(int num1, int num2); //native, java调用C++动态链接库关键字 add方法是动态链接库里的方法。
static{
System.loadLibrary("SayDLL"); //SayDLL 是动态链接库名称。
}
}
然后用 javac 进行编译 生成TestDLL.class 文件,然后 输入 javah -jni TestDLL 生成 jniTest_TestDLL.h 文件 。
请看一下这个文件的名字,它是由 包名_类名合成的。h文件。
文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniTest_TestDLL */
#ifndef _Included_jniTest_TestDLL
#define _Included_jniTest_TestDLL
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jniTest_TestDLL
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jniTest_TestDLL_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
上面的内容是由javah 编译时自动生成的,然后把这个文件 拷贝到C++开发环境里新建的工程下。
因为C还要调用javajdk里面别的.h文件,所以最好把java jdk和C的开发环境装在一个电脑上。
我用的是Visual Studio ,点新建项目,先C++,然后点右侧 win32 DLL 项目名称为 SayDLL ,打开SayDLL.cpp文件属性页,点C++,常规,在右侧附加包含目录里添加java jdk 下 include目录和win32目录。如:D:/Program Files/Java/jdk1.6.0/include;D:/Program Files/Java/jdk1.6.0/include/win32;这两个目录。然后在SayDLL.cpp里输入以下内容:
// SayDLL.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "jniTest_TestDLL.h"
JNIEXPORT jint JNICALL Java_jniTest_TestDLL_add
(JNIEnv * env, jobject obj, jint num1, jint num2)
{
return num1 * num2;
}
作为例子,我只做了个乘法运算。然后生成dll
把dll放在java搜索的目录下,搜索目录我下面有代码。 然后在java里新建一个类,测试:
package jniTest;
public class TestSayDLL {
/**
* @param args
*/
public static void main(String[] args) {
//System.out.println(System.getProperty("java.library.path")); //这个输出就是java的搜索目录,不清楚的可以打印一下看看。
TestDLL test = new TestDLL();
System.out.println(test.add(2, 3));
}
}
运行之后,java输出台就会输出 6;完毕。
java搜索目录:D:/Program Files/Java/jdk1.6.0/jre/bin;.;
C:/WINDOWS/Sun/Java/bin;
C:/WINDOWS/system32;
C:/WINDOWS;
D:/Program Files/Java/jdk1.6.0/bin;
D:/Program Files/Java/jdk1.6.0/lib;
C:/WINDOWS/system32;
C:/WINDOWS/System32/Wbem;
C:/Program Files/Microsoft SQL Server/90/Tools/binn/
根据每个电脑的配置不同,这个目录不尽相同,不过大体是一个的,除了win的默认目录,就是java的目录。最好放在java目录里面。如第一行的jre/bin目录里面。