最近项目中需要对程序中一部分代码进行优化,所以要将一部分功能用C语言实现,这就涉及到java和C的交互。
今天做了一个小demo,主要用C语言实现了一个累加功能,java调用C生成的dll库。
运行环境:Win7+ Eclipse Version: Helios + MinGW1.5.6
(1)安装MinGW,配置环境变量。
右击我的电脑,点属性->高级->环境变量。
1、在PATH里加入C:\MinGW\bin(MinGW的安装目录)
2、新建LIBRARY_PATH变量,在值中加入C:\MinGW\lib,这是标准库的位置。
3、新建C_INCLUDEDE_PATH变量,值设为C:\MinGW\include。
4、新建CPLUS_INCLUDE_PATH变量,值为C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5;
C:\MinGW\include\c++\3.4.5\backward;C:\MinGW\include
(2)编写CallTest.java文件
public class CallTest {
static {
System.loadLibrary("plus");
}
public static native int getPlusAnswer(int x);
public static void main(String...args){
System.out.println("answer of 10="+getPlusAnswer(100));
}
}
进入到工程项目的bin目录,使用javah CallTest命令,生成CallTest.h文件。
如下所示:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class CallTest */
#ifndef _Included_CallTest
#define _Included_CallTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallTest
* Method: getPlusAnswer
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
其中Java_CallTest_getPlusAnswer是我们关心的方法,这便是后面要具体实现的方法。
(3)编写plus.c实现功能,该源文件引用(2)中的头文件。
#include <stdio.h>
#include "CallTest.h"
#include "jni.h"
int n=0;
int j=0;
int answer=0;
JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
(JNIEnv *env, jclass class, jint x){
n=x;
for(j=1;j<=n;j++)
answer+=j;
return answer;
}
(4)好了,接下来编译plus.c文件生成plus.o
进入文件的目录,使用命令
gcc -c -I"C:\Program Files\Java\jdk1.6.0_10\include" -I"C:\Program Files\Java\jdk1.6.0_10\include\win32" -o plus.o plus.c
这里两个引号是jdk安装目录下的一些c头文件的目录
(5)新建plus.def文件,用于生成dll
plus.def文件内容如下
EXPORTS
Java_CallTest_getPlusAnswer
第二行是方法名
生成dll文件plus.dll
gcc -shared -o plus.dll plus.o plus.def
(6)拷贝plus.dll到工程目录下
*:System.loadLibrary("plus")的引号中是文件在工程的相对路径,默认是工程文件的根目录。
执行java文件,生成结果。
附件为测试代码