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

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

















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值