Windows 7下,java jni调用C程序demo,编译器为mingw

本文介绍如何使用Eclipse和Mingw实现Java程序调用C语言编写的DLL库,包括生成JNI头文件、编写C代码、编译DLL及解决链接错误的过程。

下载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里面都要添加),以源文件为例
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的世界。
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值