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调用即可
从而更好的实现了跨平台的实用。
在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调用即可
相关文章推荐
- Matlab与c++混合编程[四.通过VC调用Matlab编译产生的dll文件]
- VC与Matlab混合编程(在VC中调用.m文件编译生成的DLL)
- java调用vc编译的dll
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用
- win7 VS2012 编译可在XP下调用的dll文件
- 64位win7下vc2010如何调用matlab2012a中生成的dll文件
- Java调用 dll 文件里的方法
- java调用dll文件处理过程
- JAVA 调用 DLL 文件 TSCLIB.DLL TSC打印机
- 用java调用编译器编译java文件-马士兵设计模式教程-动态代理 .
- java中调用dll文件
- java调用dll或so动态库文件(c++/c)
- 02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译
- 使用VC脚本编译本地dll调用
- win32下使用gcc编译供java 调用的dll须知(jni) http://www.blogjava.net/lixf/archive/2005/12/23/25177.html
- Java採用JNI调用VC++生成的dll(Java与C++交互)
- 用java调用编译器编译java文件-动态代理
- 整理MINGW编译dll使用JNI被java调用的几种方式
- 如何把.js文件编译成dll供页面调用
- 02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译