myJavaBlog

java世界
随笔 - 43, 文章 - 0, 评论 - 2, 引用 - 0
数据加载中……

关于java对dll的调用

为方便讨论,例子中dll只导出了一个计算两个参数和的方法。 
------------------------- 
注: 
java调用dll一般来说都是要根据头文件再去实现一下dll(c++,fortran等),有的童鞋可能会问:我只有一个dll文件,我想调用里面的方法,能不能直接用?这个据偶的水平没法解决,可能有高手会~~ 
------------------------- 
    第一步:生成编写dll文件所需的C语言头文件 
首先建立dllTest工程,在src目录下建包com.lxw; 
建立java文件DllTest.java: 
package com.lxw; 

import java.lang.System; 

public class DllTest { 
static{ 
System.loadLibrary("DllTest");  //载入dll,不用后缀 

public native static int getSum(int i,int j);//函数声明 

cmd进入dos下,进入D:\workspace\dllTest\src\com\lxw目录; 
使用命令javac DllTest.java,编译文件,在lxw目录下生成DllTest.class文件; 
使用命令cd..两次进入src目录; 
使用命令javah -jni com.lxw.DllTest即可在src目录下生成com_lxw_DllTest.h的头文件,内容如下: 
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_lxw_DllTest */ 

#ifndef _Included_com_lxw_DllTest 
#define _Included_com_lxw_DllTest 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:     com_lxw_DllTest 
* Method:    getSum 
* Signature: (II)I 
*/ 
JNIEXPORT jint JNICALL Java_com_lxw_DllTest_getSum 
  (JNIEnv *, jclass, jint, jint); 

#ifdef __cplusplus 

#endif 
#endif 
注意生成的头文件导出的函数名字为Java_com_lxw_DllTest_getSum; 
------------------------- 
    第二步:编写dll文件 
打开vc选择新建工程DllTest,类型选择dll,可以将export symbols参数选上,帮你生成一些基本文件;也可不选;
将com_lxw_DllTest.h文件拷贝到工程目录下,我这里为:D:\vs2010projects\DllTest\DllTest; 
将jawt_md.h,jni.h,jni_md.h文件(jdk的include目录和include\win32目录)拷贝到vc目录:C:\Program Files\Microsoft Visual Studio 10.0\VC\include; 
这时工程并不包含拷贝进去的头文件,所以在工程的Header Files下右键导入com_lxw_DllTest.h文件;导入后同级的头文件还有stdafx.h和targetver.h文件,自动生成的DllTest.h可以删掉; 
在Source Files下有三个文件dllmain.cpp,DllTest.cpp,stdafx.cpp,其中dllmain是dll必须的,自动生成,stdafx也是系统自动生成的,不用管,dllmain的内容如下: 
// dllmain.cpp : Defines the entry point for the DLL application. 
#include "stdafx.h" 

BOOL APIENTRY DllMain( HMODULE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved 


switch (ul_reason_for_call) 

case DLL_PROCESS_ATTACH: 
case DLL_THREAD_ATTACH: 
case DLL_THREAD_DETACH: 
case DLL_PROCESS_DETACH: 
break; 

return TRUE; 

这个就是dll的入口函数,和main winmain类似,主要处理dll的四种状态,不详谈了,有兴趣可以自己去了解; 
DllTest.cpp文件可能会自动生成一些内容,vs2010的会实现一个int,class以及一个函数,这里将他们全部删除,编辑内容如下: 
// DllTest.cpp : Defines the exported functions for the DLL application. 
// 

#include "stdafx.h" 
#include "com_lxw_DllTest.h" 
JNIEXPORT jint JNICALL Java_com_lxw_DllTest_getSum 
(JNIEnv *, jclass, jint a, jint b){
          return a+b; 

注意包含头文件,导出函数的格式可以从com_lxw_DllTest.h拷贝,不过多了参数a,b; 
OK,编译工程,会在debug或者release目录下生成DllTest.dll文件; 
我们可以看一下此文件导出的内容: 
在dll所在目录下使用命令dumpbin -exports DllTest.dll >1.txt,打开1.txt,其中里面有内容: 
ordinal hint RVA      name 

          1    0 00001010 _Java_com_lxw_DllTest_getSum@16 = _Java_com_lxw_DllTest_getSum@16 
我们可以看到这个dll导出了一个函数,名字为_Java_com_lxw_DllTest_getSum;但是我们在后面的java文件中调用的时候使用getSum名字就可以; 
------------------------- 
    第三步:java中调用DllTest.dll 
首先必须将DllTest.dll文件拷贝到java可以识别的路径,这里我拷贝到jdk的bin目录; 
在刚才的java工程中新建java文件: 
package com.lxw; 
public class DllMain { 

public static void main(String[] args) { 
System.out.println(DllTest.getSum(10, 11)); 


注意:这里直接使用getSum函数即可;而这里的DllTest.java文件就起到类似C语言中的头文件的作用; 
---------------- 
应该没什么遗忘的了~~~  这里写的很详细了~~~  希望可以帮到大家~~~ 
(转载请注明出处:[url=http://www.a9832.com]博彩网[/url]
[url=http://www.tswa.org]博彩通[/url])

posted on 2012-04-18 15:01 夏凡 阅读(161) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: