您的位置:首页 > 编程语言 > Java开发

Java调用dll详细例子

2012-09-16 22:03 330 查看
创建Java能调用的dll文件实例

-----------------------------------------------------------

1、编写一个类文件

package com.xinfeng.intf;

public class Animal {

public native int getAge();

public native void setAge(int age);

public native void say();

public native void run();

}

用native关键字修饰将被其它语言实现的方法

2、用javah命令生成.h文件

a、把Animal.java文件编译成class文件

b、set classpath="x:\testInvokeDll\bin",类文件生成在x:\testInvokeDll\bin\com\xinfeng\intf\Animal.class

c、进入x:\testInvokeDll\bin目录

d、javah com.xinfeng.intf.Animal

你会发现当前目录下多了一个com_xinfeng_intf_Animal.h文件

----------------------------------------------------------------------------

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_xinfeng_intf_Animal */

#ifndef _Included_com_xinfeng_intf_Animal

#define _Included_com_xinfeng_intf_Animal

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_xinfeng_intf_Animal

* Method: getAge

* Signature: ()I

*/

JNIEXPORT jint JNICALL Java_com_xinfeng_intf_Animal_getAge

(JNIEnv *, jobject);

/*

* Class: com_xinfeng_intf_Animal

* Method: setAge

* Signature: (I)V

*/

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_setAge

(JNIEnv *, jobject, jint);

/*

* Class: com_xinfeng_intf_Animal

* Method: say

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_say

(JNIEnv *, jobject);

/*

* Class: com_xinfeng_intf_Animal

* Method: run

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_run

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

----------------------------------------------------------------------------

3、生成dll文件,在此以Dev c++ v5.0汉化版为例

a、新建一个dll工程,名叫testdll

b、把里面的两个文件移除

c、右击工程名,添加,选择com_xinfeng_intf_Animal.h确定

d、新建一个单元,假如名称为testdll.cpp,把com_xinfeng_intf_Animal.h声明的方法实现

----------------------------------------------------------------------------

#include <stdio.h>

#include "com_xinfeng_intf_Animal.h"

int age = 0;

JNIEXPORT jint JNICALL Java_com_xinfeng_intf_Animal_getAge

(JNIEnv *, jobject)

{

return age;

}

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_setAge

(JNIEnv *, jobject, jint _age)

{

age = _age;

}

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_say

(JNIEnv *, jobject)

{

printf("Hello World!\n");

}

JNIEXPORT void JNICALL Java_com_xinfeng_intf_Animal_run

(JNIEnv *, jobject)

{

printf("Running!\n");

}

----------------------------------------------------------------------------

e、点击“运行”->“编译”,这时你会看到很多数据类型没被声明的错误,那是因为

com_xinfeng_intf_Animal.h使用了很多JAVA_HOME/include/jni.h文件自定义的数据类型,而jni.h又引

用了JAVA_HOME/include/win32/jni_md.h,这时你需要把jni.h和jni_md.h引入到工程里面来,左击工程名

“工程属性”->“文件/目录”->“包含文件目录”把JAVA_HOME/include和

JAVA_HOME/include/win32文件夹添加,确定后,再次编译一切正常,这时在工程

的目录下就找到testdll.dll文件,这样dll文件就生成了

4、调用dll文件

a、把testdll.dll文件复制在项目底下

b、新建一个java文件

----------------------------------------------------------------------

package com.xinfeng.main;

import com.xinfeng.intf.Animal;

public class Main {

static{

/*

* 转入dll文件,在此不需要后缀名

* 不同的系统库文件的后缀名是不一样的

* 如windows是dll,而linux是so

* jvm在不同系统会载入相应的库文件

*/

System.loadLibrary("dellTemplete"); //

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Animal persion = new Animal();

persion.setAge(23);

System.out.println("Age: " + persion.getAge());

persion.say();

persion.run();

}

}

----------------------------------------------------------------------

可能上面有些名词用错了,请多包含!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: