Java调用dll详细例子

作者: nick 分类: java 发布时间: 2010-12-26 04:03 ė 61条评论

创建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();
}

}
———————————————————————-

可能上面有些名词用错了,请多包含!

本文出自 传播、沟通、分享,转载时请注明出处及相应链接。

本文永久链接: https://www.nickdd.cn/?p=1310

发表评论

您的电子邮箱地址不会被公开。

Ɣ回顶部