java web采用JNAjava 加载dllc的dll,回调函数问题

JNA调用DLL,JNative函数回调
我手头上现在有一个DLL,在DLL 中有一个函数:_GoSdk_Version ,JNA中使用什么协议可以调用
__stdcall会使导出函数名字前面加一个下划线,后面加一个@再加上参数的字节数,
比如_MyFunction@4的参数(int iVariant)就是4个字节 __fastcall与 __stdcall
类似,不过前面没有下划线,而是一个@,比如@MyFunction@4 __cdecl则是始函数名
_GoSdk_Version&
public interface GoSdk extends StdCallLibrary { & & & & & &
& & & & &//加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录 & &
GoSdk instance = (GoSdk)Native.loadLibrary("GoSdk", GoSdk.class); &
& & & & //定义接口 & &
& & & & public int _GoSdk_Version ();//定义接口 &-编译无法通过&
使用JNative 可以正常调用
JNative&jna = new JNative("GoSdk.dll","_GoSdk_Version@0",Convention.STDCALL);//初始化DLL&
jna.invoke();//执行函数
你的写法有问题吧。请参考我的博客。http://my.oschina.net/kkrgwbj/blog/54759812:12 提问
java - jna 中的回调问题
在jna中使用回调函数遇到的,使用回调函数用作事件监听.问题如下
比如有两个硬件,配套了dll,单独加载时回调正常,事件能正常监听,
A.dll上送input事件,A.class能监听到,
B.dll上送inserted事件,B.class能监听到.
但如果在同一个项目中(同一个jvm),同时加载A.dll和B.dll时
只能监听到先加载的dll事件,后加载的则无法监听.(不触发回调)
不知道是不是jna的bug?
请问有高人能解答么?毕竟我也不太可能每一个硬件启动一个jvm,这样问题是解决了,但性能损耗和其他衍生问题会变的更麻烦.
package com.sunyard.vtm.drivers.
import com.sun.jna.C
import com.sun.jna.L
import com.sun.jna.N
import com.sunyard.vtm.drivers.dictionary.FingerS
import com.sunyard.vtm.drivers.listener.IFingerL
* 指纹扫描仪驱动(封装dll驱动)
* @author Efy
public class FINDriver {
* 继承jna的Library接口 逻辑:
* &p&1.继承jna的Library后,注册dll库中的方法(输入参数,返回参数都必须与dll库一致)
* &p&2.如需使用回调则需要dll提供注册回调方法
* @author Efy
public interface FinLibrary extends Library {
* 启动设备
* @author Efy
public abstract boolean open();
* 关闭设备
* @author Efy
public abstract void close();
* 设备重置
* @author Efy
public abstract boolean reset();
* 获取设备状态
* @author Efy
public abstract FingerStatus getStatus();
* 获取指纹模板
* @author Efy
public abstract boolean getFingerTemplete(String filePath);
* 获取指纹特征
* @author Efy
public abstract boolean getFingerFeature(String filePath);
* 比对指纹
* @author Efy
public abstract boolean compareFinger(String filePath);
* 释放内存
* @author Efy
public abstract void freeMemory();
* 回调监听
* @author Efy
public abstract void addListener(FinEventListener listener);
* 注册回调接口监听
* @author Efy
public interface FinEventListener extends Callback {
* 回调接口
* @author Efy
public abstract void callback(int arg0,int arg1,String data);
* 内部类实现FinEventListener接口,处理回调事件
* 使用时,先在此驱动中声明一个监听接口,由上层set此接口的实现
* @author Efy
public class CallBackInstance implements FinEventListener{
* 回调接口
* @author Efy
public void callback(int arg0,int arg1,String data){
switch (arg0) {
case 1032:
if(arg1 & 0){
iFingerListener.fingerComplete(data);
iFingerListener.fingerFail();
case 1044:
iFingerListener.fingerMoveIn();
case 1045:
iFingerListener.fingerMoveOut();
private FINDriver() {
// 构造时装载dll
lib = (FinLibrary) Native.loadLibrary("FingerLoader.dll", FinLibrary.class);
System.out.println("装载FingerLoader.dll...成功.");
}catch(UnsatisfiedLinkError e){
System.out.println("未找到FingerLoader.dll.");
// 实例化回调接口
if (callback == null) {
callback = new CallBackInstance();
private static FinL
private static FIND
private static CallBackI
private static IFingerListener iFingerL
* 单例模式
public static FINDriver getInstance() {
if (instance == null){
instance = new FINDriver();
public FinLibrary getLib() {
public CallBackInstance getCallback() {
public void setiFingerListener(IFingerListener iFingerListener) {
lib.addListener(callback);
FINDriver.iFingerListener = iFingerL
其他相似问题下次自动登录
现在的位置:
& 综合 & 正文
在java中使用JNA调用加载DLL
最近公司上一个项目,但是要调用另外一个公司的dll文件,刚开始无从下手,后来在网上查了下发现使用Java JNA来加载DLL挺方便的。和大家分享下,废话不说了直接举一个例子:
public class LoadDll{
public interface Dll extends StdCallLibrary {
Dll INSTANCE = (Dll) Native.loadLibrary("dllName", Dll.class);、
//在这个地方可以把dll中的所有的方法一一列举出来
1:使用JNA 加载dll你首先需要下载JNA.jar,这个jar文件可以在sun官网下载到。
2:dllName这个地方只能是dll的名字,不能加".dll"这个是为了跨平台。
3:使用JNA通常会遇到不能加载的问题,这一般是应为dll文件没有放在正确的位置导致的。
1:dll文件要放到项目路径下;
2:把dll文件放到库文件路径下,执行这句代码 System.out.println(System.getProperty("java.library.path"));
然后把dll文件copy到任意一个路径下
3:dll名字好像不能带有“_”(这个是我自己遇到的一个问题,仅供参考)
注意到这三点基本可以解决使用JNA加载C++,Delphi,C的dll的所有问题了。
&&&&推荐文章:
【上篇】【下篇】13515人阅读
Java(53)
&&&&&&&&最近由于工作需要,在和其它系统交互的问题上不仅仅是WebService的交互,还需要利用Java调用其它语言编写的动态链接库,例如编译好的dll文件.好,简单看一下这个问题的来源。&&&&&&&&& 我们的系统和其它系统进行交互的时候,需要网络这个阶段,这段期间数据很容易被截获,这就需要对一些敏感的数据进行加密。通常单个系统我们会用MD5进行加密,无法逆向破解,相对来说还是比较安全的,已经足够使用了。但是为了网络中传输的数据也是密文,这就需要再次进行加密了,所谓的私钥,公钥。经典的例如:DES,加强版3DES等。好先看一下简单流程:&&&&&&&&&&&这种情况下,A系统是建立在B系统的基础之上的,随意加密算法我们需要和B用一套,一般情况下,用B系统语言写的(当然A也可以),A是利用Java进行开发的,B是利用delphi,C,C++等编写的,所以我们就需要利用Java来调用其他语言编译好的Dll等文件,就像我们Java的.class文件一样。好这里看一种比较方便简单使用的JNA。&&&&&&&& JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。&&&&& &&&&&&&&优点:JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。&&&&&&&&简单看一下流程操作,首先下载jna.jar,并引入到项目中,然后看一下下边的代码&package com.ljh.
import com.sun.jna.N
import com.sun.jna.win32.StdCallL
* 测试jna调用本地接口
* @author ljh
public class testJna {
//上层接口
//需要继承stdCallLibrary,一种协议,当然也可以直接继承Library上层接口,看对方的DLL文件的编写遵从哪一种协议, 这个是jna标准
//必须定义一个接口,将Dll文件的方法提取出来,注意类型的对应
public interface EncrypStrTest extends StdCallLibrary {
//加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录
EncrypStrTest instance = (EncrypStrTest)Native.loadLibrary(&Dll文件的名字&, EncrypStrTest.class);
//定义接口,
public String EncrypString(String aSrc, String aKey);//定义接口
public static void main(String[] args) {
EncrypStrTest jnaDemo=EncrypStrTest.
String resultString=jnaDemo.EncrypString(&参数一&,&参数二&);
System.out.println(&会有结果么:& + resultString);
}catch(Exception e){
e.printStackTrace();
}&&&&&&&&&这样我们就可以调用其它语言的dll控件了,而windows本身提供了很多dll控件我们就可以通过JNA进行本地方法的调用了,这样大大扩展了Java程序的面。非常方便的,当然了还有其他方法,不断学习中……&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2041736次
积分:20430
积分:20430
排名:第378名
原创:242篇
转载:21篇
评论:3515条
文章:23篇
阅读:316749
阅读:151402
文章:10篇
阅读:28434
文章:12篇
阅读:53134
(6)(3)(3)(3)(7)(1)(1)(1)(2)(2)(1)(1)(5)(4)(3)(3)(6)(1)(4)(10)(26)(10)(5)(11)(4)(2)(7)(7)(4)(4)(6)(5)(3)(4)(3)(4)(9)(13)(3)(10)(12)(3)(3)(5)(4)(6)(12)(1)(7)(1)(2)JNA callback的c++动态链接库,实现了java和c++的互相调用
我的图书馆
JNA callback的c++动态链接库,实现了java和c++的互相调用
今天偶然看到了JNA的介绍,下载下来试了一下,很好用,相比较JNI要简单很多。做了一个可以callback的c++动态链接库,实现了java和c++的互相调用。
&1、开发环境:
&开发工具:Netbeans 6.8,包含了Java和C++开发插件,用一个工具比较方便,可以同时开发C++的dll和Java代码。
C++环境:MingW 5.1.6+MSYS、g++ 3.4.5
Java环境:JDK 1.6.0_18
&2、C++代码
&用Netbeans创建一个动态链接库项目JNALib,创建一个c++源文件clib.cpp,生成结果为libJNALib.dll
&#include&&stdlib.h&#include&&iostream&using&namespace&extern&"C"{&&&&typedef&void&(*OpenFunc)(const&char*,int);&&&&OpenFunc&openfunc&=&NULL;&&&&void&init(OpenFunc&func)&{&&&&&&&&cout&&&&"init&called"&&&&&&&&&&&openfunc&=&&&&&}&&&&void&test()&{&&&&&&&&if&(openfunc&==&NULL)&{&&&&&&&&&&&&cout&&&&"openfunc&is&NULL"&&&&&&&&&&&&}&&&&&&&&(*openfunc)("test",&<SPAN style="COLOR: #);&&&&}}
注意:其中OpenFunc声明了一个回调类型,也就是一个函数指针,可以通过init将java中的OpenFunc方法传递进来,设置这个函数指针,如此一来,可以实现C++到Java的回调。
&3、Java代码
&创建一个Java项目JNADemo,创建一个包clibtest,创建以下java代码:
package&import&com.sun.jna.Cimport&com.sun.jna.Lpublic&interface&CLib&extends&Library{&&&&public&interface&OpenFunc&extends&Callback&{&&&&&&&&void&invoke(String&filename,&int&i);&&&&}&&&&void&init(OpenFunc&openfunc);&&&&void&test();}
package&import&com.sun.jna.Npublic&class&hello&{&&&&public&static&void&main(String[]&args)&{&&&&&&&&//&Loading&dynamically&the&library&&&&&&&&CLib&lib&=&(CLib)&Native.loadLibrary("libJNALib",&CLib.class);&&&&&&&&lib.init(new&CLib.OpenFunc()&{&&&&&&&&&&&&public&void&invoke(String&filename,&int&i)&{&&&&&&&&&&&&&&&&System.out.println("callback&called.");&&&&&&&&&&&&&&&&System.out.println(filename);&&&&&&&&&&&&}&&&&&&&&});&&&&&&&&lib.test();&&&&}}
4、项目结构如下5、编译C++项目,生成libJNALib.dll,拷贝到JNADemo主目录,目录结构如下:6、运行程序,结果如下:
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 java web项目加载dll 的文章

 

随机推荐