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

java调用VC编译而成的dll文件

2013-05-25 18:22 330 查看
在JAVA中调用VC编写的程序,JAVA提供一个本地方法,交给VC去实现,就是相当JAVA的接口与实现, 只不过中间的接口实现是VC实现的。

从而更好的实现了跨平台的实用。

在Vc中建立一个空的dll工程,里面什么文件也没有,目的是Vc编译生成的是DLL文件,而不是EXE,注意一些设置,如果有些设置不对,则JAVA在加载你的dll文件时会出错。

然后把JAVA生成的一个.h文件拷到VC的项目中,作为VC程序的一个头文件,另外JDK路径下的include文件夹下拷贝出来就可以了,分别是: jni.h 和 include 下的 win32\jni_md.h文件也都拷到vc项目中

JAVA项目中需导入一个jnative.jar包

下面我写一个例子:

JAVA:

package com.sinosoft;

public class LoadDll {

static {

//动态加载dll到类库,注意:这里的dll路径必须为绝对路径

System.load("E:\\loadDllName.dll");

//此处直接加载的是环境变量path路径下dll文件 ,注意:直接是dll文件的名字,不是”loadDllName.dll“

System.loadLibrary("loadDllName");

}

//声明一个本地方法,此方法java中不需要去实现 , 只要声明就可以

//此方法是交由VC实现,相当于JAVA中声明一个接口

public native static void getPrintDocument();

}

编译成.class文件后

生成.h文件,供VC头文件使用

运行cmd进入dos窗口,进入刚才编译生成字节码.class文件的目录

然后输入javah -classpath . -jni com.sinosoft.LoadDll 其中 “.“表示当前目录

生成的文件com_sinosoft_LoadDll.h,内容为

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

#include <jni.h>

/* Header for class com_sinosoft_LoadDll */

#ifndef _Included_com_sinosoft_LoadDll

#define _Included_com_sinosoft_LoadDll

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_sinosoft_LoadDll

* Method: getPrintDocument

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_sinosoft_LoadDll_getPrintDocument

(JNIEnv *, jclass);

#ifdef __cplusplus

}

#endif

#endif

注意:导入的.h文件不要更改里面的内容,否则可能会出问题。如果在VC中打开com_sinosoft_LoadDll.h文件的 “#include <jni.h>” 报错,说明你dll项目的配置不正确

其中的参数JNIEnv *, jclass 是系统生成的 ,可以不用管

里面的方法JNIEXPORT void JNICALL Java_com_sinosoft_LoadDll_getPrintDocument

(JNIEnv *, jclass);就是由Vc实现

VC中的test.cpp实现这个函数:

#include "com_sinosoft_LoadDll.h"

JNIEXPORT void JNICALL Java_com_sinosoft_LoadDll_getPrintDocument

(JNIEnv *, jclass);

{

}

编译生成loadDllName.dll文件

将loadDllName.dll文件给JAVA调用即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: