当前位置: 技术问答>java相关
jni调用dll问题
来源: 互联网 发布时间:2015-04-17
本文导语: 我现在需要在java中调用打印机驱动程序dll的一些方法 但是,jni调用的dll必须按照java class 生成的 .h文件的规定来写,这样好像无法在java 中直接调用驱动的dll 请问,如何实现在java中如何调用驱动程序的dll 谢谢 ...
我现在需要在java中调用打印机驱动程序dll的一些方法
但是,jni调用的dll必须按照java class 生成的 .h文件的规定来写,这样好像无法在java 中直接调用驱动的dll
请问,如何实现在java中如何调用驱动程序的dll
谢谢
但是,jni调用的dll必须按照java class 生成的 .h文件的规定来写,这样好像无法在java 中直接调用驱动的dll
请问,如何实现在java中如何调用驱动程序的dll
谢谢
|
public class testDll
{
private native void Print_Proxy();
static
{
try
{
System.loadLibrary("dllName");//你生成的dll的名字
}
catch(SecurityException e)
{
System.err.println("load failed");
}
}
public void Print_Java(String[] version)
{
Print_Proxy();
}
}
javac testDll.java
javah -jni testDll
cl -I JAVA_HOMEinclude -I JAVA_HOMEincludewin32 -LD testDll.c -FedllName.dll
testDll.c
#include
#include
#include "softCertProxy.h"
typedef UINT (CALLBACK* PRINT_DLL)(char *);
JNIEXPORT jint JNICALL Java_testDll_Print_1Proxy
(JNIEnv * jEnv, jobject this)
{
HINSTANCE hDLL;
PRINT_DLL Print_Dll;
hDLL =LoadLibrary("Dll");//你要调用的dll
Print_Dll =(PRINT_DLL)GetProcAddress(hDLL,"print");//调用dll里的方法名
if (!Pring_Dll)
{
// handle the error
FreeLibrary(hDLL);
printf("dll link failedn");
return flag;
}
else
{
//处理函数,具体看api,jni.h
}
}
我是假定你的dll里有print()方法。
{
private native void Print_Proxy();
static
{
try
{
System.loadLibrary("dllName");//你生成的dll的名字
}
catch(SecurityException e)
{
System.err.println("load failed");
}
}
public void Print_Java(String[] version)
{
Print_Proxy();
}
}
javac testDll.java
javah -jni testDll
cl -I JAVA_HOMEinclude -I JAVA_HOMEincludewin32 -LD testDll.c -FedllName.dll
testDll.c
#include
#include
#include "softCertProxy.h"
typedef UINT (CALLBACK* PRINT_DLL)(char *);
JNIEXPORT jint JNICALL Java_testDll_Print_1Proxy
(JNIEnv * jEnv, jobject this)
{
HINSTANCE hDLL;
PRINT_DLL Print_Dll;
hDLL =LoadLibrary("Dll");//你要调用的dll
Print_Dll =(PRINT_DLL)GetProcAddress(hDLL,"print");//调用dll里的方法名
if (!Pring_Dll)
{
// handle the error
FreeLibrary(hDLL);
printf("dll link failedn");
return flag;
}
else
{
//处理函数,具体看api,jni.h
}
}
我是假定你的dll里有print()方法。
|
如果看了
就知道很清楚了:
流程是这样:
1.首先的有.dll的.h文件既API说明
2.写java代码你的方法应是调用本地方法的如:
...
//包装本地方法的java方法
void foo()
{
nativeFoo();
}
//声明本地方法的调用方法
native void nativeFoo();
...
3.编译上面的.java文件
会生成.class文件
4.用javah yourclasssname生成jni的头文件*.h
5.建立一个c/c++的工程(DLL)实现你的头文件的方法
6.编译后生成yourcppname.dll
7.把yourcppname.dll考到classpath路径下在2.步的你的.java类中加入
static
{
System.out.loadLibrary("yourcppname");
}后重新编译
8.执行重新编译后的.class......OK!
就知道很清楚了:
流程是这样:
1.首先的有.dll的.h文件既API说明
2.写java代码你的方法应是调用本地方法的如:
...
//包装本地方法的java方法
void foo()
{
nativeFoo();
}
//声明本地方法的调用方法
native void nativeFoo();
...
3.编译上面的.java文件
会生成.class文件
4.用javah yourclasssname生成jni的头文件*.h
5.建立一个c/c++的工程(DLL)实现你的头文件的方法
6.编译后生成yourcppname.dll
7.把yourcppname.dll考到classpath路径下在2.步的你的.java类中加入
static
{
System.out.loadLibrary("yourcppname");
}后重新编译
8.执行重新编译后的.class......OK!