j2ee通过jni接口调用动态链接库DLL

前端时间学习了Android的jni接口,一直很好奇windows上是否也有这种东西,百度了一番,果然,但是windows上动态链接库的后缀名为.dll,在linux上为.so。windows上调用dll的方法有很多种,通过jni调用是最原始的方法,也是最灵活的方法,但是就是麻烦。

这个想法想了很久,但是就是没时间去搞,趁着最近公司没有什么项目做,比较有空,就拿出来搞一搞。废话不多说,进入正题。

方法一:(通过命令进行编译)

1.新建一个java文件。编写java代码,文件名为:HelloWorld.java

代码如下:

public class HelloWorld
{
	static{
		System.loadLibrary("HelloWorldDll");	
	}

	public native static int MyMethod();

	public static void main(String[] args){
		HelloWorld hw = new HelloWorld();
		hw.MyMethod();
	}
}
2. 编译 java 代码,生成 class文件。

在命令行下输入:javac HelloWorld.java

编译成功后,在同目录下会生成HelloWorld.class文件。

ps:编译时要将dos目录切换至当前目录。

3.根据class文件生成HelloWorld.h,以供C++调用。

在命令行下输入:javah HelloWorld

编译成功后,在同目录下会生成HelloWorld.h文件。

生成代码文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    MyMethod
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
ps:切记,如果第一步编写java代码时java文件带了包名,需要连同包名一起写进去。例如:javah com.biidi.nativemethod.HelloWorld。

到这里已经到达一段落了,接下来使用vc6.0创建DLL工程。

4.使用VC++创建dll程序。文件名:HelloWorldDll.dll

首先打开vc点击新建工程,过程如下图:

这里如果是准备使用C代码编写的选择“一个空的DLL工程”,如果使用C++代码编写的选择“一个简单的DLL工程”,我这里选择的是第一个。


工程建立完后如下:

新建一个.c文件

编写.c文件中的代码,编译。代码如下:

#include <stdio.h>
#include <jni.h>
#include "HelloWorld.h"

JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod (JNIEnv *env, jclass thiz)
{
	printf("this is helloworld printed in dll");
	return 1;
}

ps:1.首先需要将第三步编译出来的HelloWorld.h拷贝到C工程目录下;

 2.需要将jni.h和jni_md.h头文件拷贝到vc的头函数库里,或者拷贝到工程目录下,放置于工程目录下需要将include时<>修改为“”。

出错举例:

错误1:fatal error C1083: Cannot open include file: 'HelloWorld.h': No such file or directory

原因:没有把D盘下的HelloWorld.h拷贝到工程目录下面。

错误2:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

原因:没有把jni.h拷贝到工程目录下。Jin.h的位置:C:\Program Files\Java\jdk1.5.0_06\include

错误3:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

原因:为什么我已经把jni.h拷贝到工程目录下了,还是会报这个错误呢?那是因为HelloWorld.h里面的#include <jni.h>忘了改成#include “jni.h”

错误4:fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory

原因:又是找不到.h。这个jni_md.h藏在C:\Program Files\Java\jdk1.5.0_06\include\win32下面。

至此,在C工程目录下的Debug已经生成了HelloWorldDll.dll文件。

5.将HelloWorldDll.dll文件拷贝至HelloWorld.class文件同目录下,从命令行执行:Java HelloWorld

看看效果吧:

参考资料:http://www.cnblogs.com/GoAhead/archive/2012/12/09/2809944.html

Deme工程文件,请移步到我的资源下载。

http://download.csdn.net/detail/gjh460293451/8184635








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值