jnative callback 回调函数的实现

jnative 1.3.2版本发布了,可以完美支持C回调函数。不过令我很恼火的是还不支持activex dll的调用,问了jnative的作者,他说会在jnative 后继版本支持,大家期待吧!不然要用jacob,在一个项目里面用两种技术,我想任何人都不愿意这样做。
首先定义一个回调类模板:
package com.syct.jnative.wrapper;

import java.util.ArrayList;
import java.util.List;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;

import org.xvolks.jnative.util.Callback;

public abstract class DataPackageCallback implements Callback {
private final List<Long> dataPackage;

public DataPackageCallback() {
dataPackage = new ArrayList<Long>();
}
public List getCallbackDataPackage() {

ProcessCallbackDataPackage(dataPackage);
return dataPackage;

}

public int callback(long[] values) {
// TODO Auto-generated method stub

if (values == null) {
return 3;
}
if (values.length == 2) {
try {
if (values[0] > 0) {
dataPackage.add(values[0]);
System.out.println(values[1]);
}
} catch (Exception e) {
e.printStackTrace();
}

return 1;
} else {
return 2;
}
}

//分配内存
public int getCallbackAddress() throws NativeException {
// TODO Auto-generated method stub
return JNative.createCallback(2, this);
}
//这个方法在子类实现
protected abstract void ProcessCallbackDataPackage(List<Long> dataPackage);
}


然后子类继承:
package test;

import java.util.List;


import org.xvolks.jnative.misc.basicStructures.HWND;

import org.xvolks.jnative.util.User32;

import com.syct.jnative.wrapper.DataPackageCallback;

public class MyEnumCallback extends DataPackageCallback{

StringBuffer sb=new StringBuffer();
public String getWindowEnumList(){
return sb.toString();
}
/**
* MyEnumCallback要继承DataPackageCallback
* 这个方法得到回调参数的值
*/
@Override
protected void ProcessCallbackDataPackage(List<Long> dataPackage) {
// TODO Auto-generated method stub

for (Long key : dataPackage) {
try {
//System.err.println("Handle : " + key);
String name = User32.GetWindowText(new HWND(key.intValue()));
// System.err.println("Name : " + name);
if (name == null || name.length() == 0) {
// System.err.println("Skipping handle " + key);
} else {
sb.append(name).append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


}

最后测试:
package test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.swing.JOptionPane;


import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.util.Callback;
import org.xvolks.jnative.util.User32;

import com.syct.jnative.wrapper.JNA_TRANS;
import com.syct.jnative.wrapper.JnaWrapper;
import com.syct.jnative.wrapper.JnaWrapperHandler;
import com.syct.jnative.wrapper.JnativeBase;

public class JnativeWrapperTest extends JnativeBase {

static String DLL_NAME = "Reader_dll";
JnaWrapper n = null;

/**
* @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接
* @return int
*/
@JNA_TRANS
public int readerInit() {

int rev = -1;
try {
n = super.initJna(DLL_NAME, "ReaderInit");
n.setRetVal(Type.INT); // 指定返回参数的类型
int i = 0;
n.setParameterInt(i++, 0);
// 指定串口
n.setParameterString(i++, "com1");
// 波特率
n.setParameterInt(i++, 9600);
// 指定usb口
n.setParameterString(i++, "usb1"); // 指定位置上的参数类型和值
// 调用方法
// 0 成功 -1 失败
rev = Integer.parseInt(n.getRetVal());
if (rev == 0) {
System.out.println("==============初始化识读头的串口成功==============");
} else if (rev == -1) {
System.out.println("==============初始化识读头的串口失败==============");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rev;
}

/**
* @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接
* @return boolean
*/

@JNA_TRANS
public boolean EnumWindows(Callback lpEnumFunc, int lParam)
throws NativeException, IllegalAccessException {
n = super.initJna("User32.dll", "EnumWindows");
n.setRetVal(Type.INT);

n.setParameterCallback(0, lpEnumFunc.getCallbackAddress());
n.setParameterInt(1, lParam);
;
return !"0".equals(n.getRetVal());
}

public void testCallback() {
try {
User32.MessageBox(0, "Callback Demo", "JNative", 0);
} catch (NativeException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
MyEnumCallback c = new MyEnumCallback();

try {
MemoryBlockFactory.createMemoryBlock(1).dispose();
if (EnumWindows(c, 0)) {
System.err.println("EnumWindows suceeded");
} else {
System.err.println("EnumWindows failed");
}
System.err.println("getAvailableCallbacks "
+ JNative.getAvailableCallbacks());
JNative.releaseCallback(c);
System.err.println(c.getCallbackDataPackage());
User32.MessageBox(0, c.getWindowEnumList(), "窗体枚举(EnumWindows)", 0);
JOptionPane.showMessageDialog(null, c.getWindowEnumList(),
"窗体枚举(EnumWindows)", JOptionPane.OK_OPTION);

} catch (NativeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private interface MyFactory {
public Object newInstance(int a, char[] b, String d);
}

public static void main(String[] args) {
/**
* JnativeWrapperTest 要继承JnativeBase 通过JnaWrapperProxy返回一个代理实例
*/
JnativeWrapperTest
test=(JnativeWrapperTest)JnaWrapperHandler.getJnaWrapperProxy(JnativeWrapperTest.class);
// test.readerInit();
test.testCallback();

}

}
AD9826的时序分析及Verliog代码 AD9826的时序分析及Verliog代码 (本文对AD9826的模式和时序进行了分析,如有错误敬请指正,关于这款ADC芯片的基本参数,本文不做过多介绍) 1、AD9826的模式 AD9826的采样模式主要有两种,一种是“CDS模式”,一种是“SHA模式”;在这两种模式下分别有1通道、2通道、3通道的采样模式 (1)CDS模式 简单的来说CDS模式就是,有两个采样时钟,一个是ADCCLK1,用来采样CCD波形的参考电平,一个是ADCCLK2用来采样数据电平,然后经过,偏移量调节,再经过PGA增益放大最 阅读详情

相关推荐

基于STM32与ESP8266的MQTT协议实现阿里云物联网平台远程LED控制

本文详细介绍了如何利用STM32单片机与ESP8266 Wi-Fi模块,通过MQTT协议连接阿里云物联网平台,实现远程控制LED灯的完整物联网项目。内容涵盖硬件连接、阿里云平台配置、MQTT协议与AT指令解析、STM32代码实战以及数据解析与调试技巧,为嵌入式开发者提供了一个清晰、实用的物联网入门实践指南。

svm4gardener的博客 791

WinForms错误:缓冲操作当前正在进行中,无法释放BufferedGraphicsContext 的可能原因和解决方法

http://www.genshuixue.com/i-cxy/p/8047746 WinForms错误:缓冲操作当前正在进行中,无法释放BufferedGraphicsContext 的可能原因和解决方法 来源:博客园2010-01-22 上一篇文章(对WebMatrix 进行现代化改造, 使其完美支持中文)里, 我谈了如何修改WebMatrix使其支持中文. 文章末尾

mosangbike的专栏 3408

从零到一:基于K375S主控的机械键盘优联无线化改造实战

本文详细记录了基于罗技K375S主控进行机械键盘优联无线化改造的全过程。从改造动机、核心原理与物料准备,到电路设计、PCB打样、焊接调试,逐步拆解了将优联技术集成到自定义机械键盘中的实战步骤。项目最终实现了低延迟、高稳定性且支持多设备连接的优联无线机械键盘,为DIY爱好者提供了高性价比的改造方案。

h0i1j2k3l的博客 601

android 和 js 之间交互的封装

android 和 js 之间交互的封装

未来很长,但我会努力的走下去。 752

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

FPGA领域四大顶级会议全景解读:从架构到应用的技术风向标

本文全景解读FPGA领域四大顶级会议(FPGA、FCCM、FPL、FPT),剖析其各自定位与技术风向。FPGA会议聚焦架构与工具创新,FCCM专攻硬件加速与定制计算,FPL覆盖从理论到应用的广泛领域,FPT则重点关注亚太市场与前沿应用。跟踪这些会议是把握FPGA技术演进、寻找创新灵感和应用方案的高效途径。

weixin_29274969的博客 335

JNative dll回调函数使用实例

JNative是供java直接调用c++dll的工具包,这样java程序员仅仅知道c++dll中的函数名和参数类型就可以直接调用dll 了,省去了使用JNI的繁琐。 下面是一个使用c++dll回调函数的例子: dll名字JNativeTest.dll   C++代码:   JNativeTest.h:   #ifndef JNativeTes_H #define...

Blackbaby 576

手把手教你学Simulink——基于Simulink的机械臂正运动学仿真建模示例

机械臂正运动学概述正运动学的核心在于根据每个关节的角度值,通过坐标变换(如DH参数法或齐次变换矩阵)计算出末端执行器相对于基座的位置和姿态。常用的数学工具包括旋转矩阵、平移向量以及它们组合而成的齐次变换矩阵。仿真目标设计并实现一个机械臂正运动学模型。输入关节角度,输出末端执行器的位置和姿态。分析不同关节角度下的机械臂位置变化。假设我们有一个简单的3自由度(DOF)平面机械臂,其各关节的长度分别为l1l1​、l2l2​和l3l3​。在Simulink中,可以使用。

MHD0815的博客 359

Jnative callback函数实现

 jnative 1.3.2版本发布了,可以完美支持C回调函数。不过令我很恼火的是还不支持activex dll的调用,问了jnative的作者,他说会在jnative 后继版本支持,大家期待吧!不然要用jacob,在一个项目里面用两种技术,我想任何人都不愿意这样做。      首先定义一个回调类模板:Java代码 <a title="复制代码" onclick="function o

2846

基于点云数据的统计滤波算法改进

随着三维视觉和点云处理技术的发展,点云数据在机器人、自动驾驶、增强现实等领域得到了广泛应用。而点云数据中常常包含着各种噪声和异常点,这些噪声和异常点会影响后续的数据处理和分析任务。因此,对点云数据进行滤波处理是必不可少的一步。在点云滤波算法中,统计滤波(Statistical Filtering)是一种常见且有效的方法。它通过对点云数据进行统计分析,将噪声和异常点剔除或修复,从而得到更为准确和可靠的点云数据。本文将介绍一种改进的统计滤波算法,并提供相应的源代码实现。

QfcaLinux的博客 292

使用DrissionPage实现携程酒店信息智能爬取

本文介绍了一个基于DrissionPage技术的携程酒店信息爬虫系统,通过监听API数据包实现高效采集。系统可自动获取酒店名称、价格、评分、位置等15个维度的数据,支持多页滚动加载和智能去重。相比传统爬虫,该方法直接解析API返回的JSON数据,避免了复杂的HTML解析和加密参数分析,提高了开发效率和稳定性。文章详细阐述了13个关键实现步骤,并强调数据采集应严格遵守法律法规,仅用于技术学习和市场研究。该系统可为旅游决策、价格监测等提供数据支持,但需注意合理使用频率和隐私保护。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 386

关于JNative处理dll回调函数的讨论

网上关于JNative处理dll回调函数的例子都是一样的,但是我尝试了n次都没有成功,但是为什么那么多人都转载这个blog呢,不知道是不是我哪里弄错了,因为是第一次接触java调用dll动态库,dll中有一个回调函数;dll说明:dll中有一个方法    int WINAPI OpenDrive(EventProc proc, WORK_MODE mode),用于设置事件回调函数,并启动USB设备...

iteye_38的博客 338

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

利用JNative实现Java调用动态库

由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 “Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:  Java调用动态库所需要关心的问题:  l         如何装载dll文件,以及如何定位所要使用的方法;  l

Silence的程序实验室 2048

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jnative实现调用动态库(1)

2007-07-25 20:25由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下“Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:Java调用动态库所需要关心的问题:l         如何装载dll文件

2103

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java通过JNative调用DLL文件

由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 “Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下: Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l...

iteye_9620的博客 276

Jnative回调函数的使用和web服务器相冲突的问题

最近由于项目需要,需要用java去调用用C++写的动态链接库,前面进展的非常艰难,因为Jnative这个组件没有像样的帮助文档对其中的很多细节根本无从去了解,只能从网上各位大神们写的文章中去摸索出个所以然来,好不容易将其中的种种问题解决,如:java回调函数的使用,以及指针的使用等,但在将项目整合的时候出现了一个令人非常纠结的问题: 发现通过Jnative调用dll动态链接库直接通过main方法...

qaide123的博客 184

c++回调java

最近的项目中用到了c++回调java,试了很多方法,有通过jni的方式,也有jna的方式,jni复杂很多,相反jna就简单不少,jna为jnative,JNative 可以让你方便的访问 Windows 平台下的 DLL 以及 Linux 平台下的 so 动态连接库文件,无需在编写一行 C/C++ 代码,JNative 是动态的。下面是我的测试demo。 1、首先建立一个动态库文件,这里用v

图老爷的博客 1213

JAVA调用DLL的两种方法(作者不详,如有冒犯请速联系我,我只是用来参考)

JAVA调用DLL的两种方法 (2008-03-05 17:24:48) 转载 标签: it   问题描述:     方法一,使用JNI: public class TestNative {   private native static int Max(int a,intb);     private native static

xhhuang1979的专栏 1007

java zpl 打印图片_JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)...

JAVA调用DLL的两种方法(2008-03-05 17:24:48)转载 标签:it问题描述:方法一,使用JNI:public class TestNative{private native static int Max(int a,intb);private native static StringgetStr();public static voidmain(String[] args){S...

weixin_31451231的博客 457

zpl java_JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)...

JAVA调用DLL的两种方法(2008-03-05 17:24:48)标签:问题描述:方法一,使用JNI:public class TestNative{private native static int Max(int a,intb);private native static StringgetStr();public static voidmain(String[] args){System...

weixin_34795681的博客 298

JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)

JAVA调用DLL的两种方法 (2008-03-05 17:24:48) 转载 标签: it 问题描述:     方法一,使用JNI: public class TestNative {   private

xhhuang1979的专栏 3554

java调用C++/C的三种方式

Java调用C++/C有3中方式:JNI、JNA、JNative,本文主要介绍了这三种方式的使用和注意事项。

大前端程序员的自我修养 7895

Java--native方法

JNA调用dll 其他网址 Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处) - 简书java通过JNA调用DLL文件(包含回调函数的实现)_Mr.小强的博客-优快云博客_java jna调用dll 简介 java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。java使用 JNI来调用dll动态库的调用,工作量略大,一般情况下开发人员会选用JNA或JNative。 使用JNativ...

IT利刃出鞘的博客 1575

Java 进程操作

导入jar http://download.youkuaiyun.com/tag/JNative.jar 对qq进行操作 import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.misc.basicStructures.HWND; import org.xvolks.jnative

叁滴水 的博客 885
上一篇: 女孩子必嫁对象
下一篇: 字符,字节和编码(很实用的文章 转载)
Reasonsoft
博客等级 码龄21年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值