在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调用即可