下载mingw,整个安装过程就不赘述了,记得安装gcc编译器就好。
1. 写一个测试的Java类
package org.bill.saint;
// generate .h file called by c program
public class TestDLL {
static{
System.loadLibrary("libttest");
}
public native int get();
public native void set(int i);
public static void main(String[] args) {
TestDLL td = new TestDLL();
td.set(11);
System.out.println(td.get());
}
}
有两个本地方法,get 和set,够简洁
2.我是在eclipse下编辑的java文件,生成class以后,进入命令行,生成与之对应的.h头文件
javah org.bill.saint.TestDLL
生成的头文件代码如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class org_bill_saint_TestDLL */
#ifndef _Included_org_bill_saint_TestDLL
#define _Included_org_bill_saint_TestDLL
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_bill_saint_TestDLL
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_bill_saint_TestDLL_get
(JNIEnv *, jobject);
/*
* Class: org_bill_saint_TestDLL
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_org_bill_saint_TestDLL_set
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
两个本地方法对应于头文件中两个方法的声明,注意方法名称,是以Java开头的,前面没有下划线,这个后面会提到,由于我们用的是mingw编译c文件,此部分在产生实际的代码时会有问题。
3.我选择的eclipse+mingw来编辑和编译C文件,新建一个shared Library C工程ttest,由于我们写的是jni的代码,所以要包含jni.h和jni_md.h这两个头文件,这两个头文件在jdk安装目录的include文件夹及其子文件夹win32(我安装的是32位JVM)下,将这两个文件拷贝到ttest工程中,同时,将上一步生成的头文件org_bill_saint_TestDLL.h拷贝到当前工程中;新建一个c源文件jnidemo.c代码如下
#include "org_bill_saint_TestDLL.h"
int i = 0;
JNIEXPORT jint JNICALL Java_org_bill_saint_TestDLL_get(JNIEnv *env,jobject obj){
return i;
}
JNIEXPORT void JNICALL Java_org_bill_saint_TestDLL_set (JNIEnv *env,jobject obj, jint j){
i = 1+j;
}
编译生成libttest.dll共享库,将其拷贝的mingw安装目录的bin下(其他目录也可,比如系统库,java_home bin等等,path环境变量下要能找到)。
4. 运行java文件,此时会报错
java.lang.UnsatisfiedLinkError
参考这篇博客 点击打开链接,我是在方法名字前面加上了下划线(头文件和jnidemo.c里面都要添加),以源文件为例
参考这篇博客 点击打开链接,我是在方法名字前面加上了下划线(头文件和jnidemo.c里面都要添加),以源文件为例
JNIEXPORT jint JNICALL _Java_org_bill_saint_TestDLL_get(JNIEnv *env,jobject obj){
return i;
}
JNIEXPORT void JNICALL _Java_org_bill_saint_TestDLL_set (JNIEnv *env,jobject obj, jint j){
i = 1+j;
}
在Java前面加上下划线,重新编译,拷贝生成的dll到mingw bin下,运行java程序,这次就可以了。
上面的过程很简单,网上有很多的例子,但是涉及的内容可不少,比如MSVC编译器和gcc编译器的差别(就是产生上面链接错误,找不到方法的根本原因),不深入讨论,可以看看《程序员的自我修养》这本书,可以大概有个了解。我是java程序员,现在进入c的世界。