- 浏览: 48115 次
- 性别:
- 来自: 广州
最新评论
-
winmap:
import jnative.wrapper.JnaWrapp ...
jnative callback 回调函数的实现 -
lfpzln:
only_java 写道发现用户NIO发数据,收到的数据是连在 ...
解读NIO Socket非阻塞模式 -
chenjunt3:
chenjunt3@163.com 谢谢!!
集成了一个框架(jdbc封装) -
ljz0898:
你好 能否提供一些源码 谢谢 549070343@qq.co ...
集成了一个框架(jdbc封装) -
沙洲胡杨:
您好,能给我发份源码吗?lbj2011@163.com
集成了一个框架(jdbc封装)
jnative 1.3.2版本发布了,可以完美支持C回调函数。不过令我很恼火的是还不支持activex dll的调用,问了jnative的作者,他说会在jnative 后继版本支持,大家期待吧!不然要用jacob,在一个项目里面用两种技术,我想任何人都不愿意这样做。
首先定义一个回调类模板:
然后子类继承:
最后测试:
import jnative.wrapper.JnaWrapperHandler;
import jnative.wrapper.JnativeBase;
你导入的这几个包是私有的吗,能否提供。
首先定义一个回调类模板:
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(); } }
评论
2 楼
winmap
2015-06-04
import jnative.wrapper.JnaWrapperHandler;
import jnative.wrapper.JnativeBase;
你导入的这几个包是私有的吗,能否提供。
1 楼
hyint
2009-02-16
哥们,你的这个帖子,还是有点不明白啊!我想请教你一些问题,希望你能帮帮忙啊!我的QQ:51563163
发表评论
-
BAT命令详解
2009-01-06 09:44 3969BAT常用命令 echo、@、call、pause、rem(小 ... -
Eclipse常用重要的几个快捷键
2008-12-05 09:21 901编辑相关快捷键 1、〔Alt+/〕 为用户提供 ... -
解读synchronized关键字
2008-11-27 12:04 879最近在写多线程程序,网上收集总结了synchronized的用 ... -
使用异或进行简单的密码加密
2008-11-19 15:05 1979/** * 使用异或进行简单的密码加密 * ... -
Java 中的位运算
2008-11-13 12:46 1969移位运算符 包括: “>> 右移 ... -
解读NIO Socket非阻塞模式
2008-11-04 16:54 7924前言: jdk供的无阻塞I/O(NIO)有 ... -
解读java.lang.ThreadLocal
2008-10-24 12:52 1317ThreadLocal是什么呢?其实ThreadLocal并非 ... -
Java之Reference
2008-10-24 12:51 982Reference Java世界泰山北 ... -
关于ClassLoader
2008-10-24 12:48 9581,什么是ClassLoader 与 C ... -
解决gwt性能问题
2008-10-24 12:08 2109最近在做gwt的项目时发现,打开第一个页面的速度非常慢, ... -
二进制、八进制、十六进制[转]
2008-06-25 16:56 1767这是一节“前不着村后不着店”的课。不同进制之间的转换纯粹是数学 ... -
16进制和byte之间的关系
2008-06-25 15:20 1783关于byte: signed byte 把 0x00 ~ ... -
字符,字节和编码(很实用的文章 转载)
2008-06-22 11:17 1096引言 “字符与编码”是 ... -
JPA中的动态查询与指定查询(转载)
2008-01-13 14:41 3223可以使用动态查询或指定查询(named query)。指定查询 ... -
Subversion快速入门教程
2008-01-13 14:37 913如何快速建立Subversion服务器,并且在项目中使用起来, ... -
泛型dao 详细剖析
2008-01-13 14:32 915由于 Java™ 5 泛 ... -
集成了一个框架(jdbc封装)
2007-11-28 17:56 4287...
相关推荐
TestJNative_Eclipse.rar 为MyEclipse工程 JNativeTest_VC.rar为VC ...主要写了一些JNative调用DLL的例子,包含了JNative回调函数的用法与指针的用法,以供参考,希望对使用JNative的开发人员有帮助 有问题大家一起讨论
本文将详细介绍JNative.jar及其相关组件,以及如何利用JNative源码来实现跨平台的本地方法调用。 首先,我们来看JNative.jar。这是一个关键的库文件,它包含Java Native Interface (JNI) 的实现,使得Java代码可以...
Jnative利用JNI接口,创建了简单的API,使得开发者无需深入了解JNI的底层机制,就能轻松地调用本地函数。 2. 注解驱动:Jnative引入了注解(Annotation)的概念,通过在Java代码中添加特定的注解,可以声明本地方法...
jnative包用于调用dll动态库,目前(2011-12-20)最新版本为1.4RC2,官方正式版本文档为1.3,详见官方地址: http://jnative.free.fr/docs/ 这是最新的帮助文档HTML离线包,希望对大家有帮助 Packages org.xvolks....
JNative 的优点在于它的易用性、数据类型处理的高效以及对回调函数的支持。在使用JNative之前,我们需要了解一些基本概念。例如,`libJNativeCpp.so`是适用于Linux平台的动态链接库,而`JNativeCpp.dll`则适用于...
利用JNative实现Java调用动态库.pdf
JNative是Java平台上的一个库,它允许Java程序直接调用本地(C/C++)代码,实现了Java与原生代码的无缝交互。通过JNative,开发者可以利用Java的跨平台优势,同时结合原生代码的高效性能,解决Java在特定场景下性能...
它们实现了与JNative.jar中的Java接口相对应的本地方法,使得Java代码可以通过JNI桥接调用这些本地函数。 使用JNative.jar包的过程通常包括以下几个步骤: 1. **创建本地方法声明**:在Java类中声明本地方法,使用...
1. **本地库加载**:`JNativeCpp.dll`和`libJNativeCpp.so`分别是Windows和Linux平台上的本地库,它们实现了与Java层交互的函数。`org.xvolks.jnative`在运行时会根据操作系统类型自动加载对应的库,并通过JNI函数...
JNative是Java Native Interface的缩写,允许Java程序调用本地函数库,实现Java程序与本地代码的交互。本手册将带领读者深入探索JNative技术的核心知识点。 第一步:编写Java代码 我们首先编写Java代码,创建一个名...
JNative是Java的一个开源库,通过JNI(Java Native Interface)提供了一种方便的方式来实现Java与C/C++代码的交互。它简化了JNI的使用,使得开发者可以更加专注于业务逻辑,而不是底层的接口实现。JNative的出现,极...
这里我们关注的工具是`jnative`,它是一个Java本地接口(Java Native Interface,JNI)的实现,允许Java代码直接调用C++编写的动态链接库(DLL)或共享库(如libJNativeCpp.so在Linux系统中)。这个过程涉及的知识点...
JNative正是这样一个工具,它允许Java程序无缝地调用本地(Native)代码,尤其是动态链接库(DLL)中的函数。JNative-1.3.2.zip这个压缩包包含的资源,正是实现这一目标的关键组件。 JNative.jar是JNative的核心库...
例如,开发者可以创建Java方法,通过JNative的API加载相应的.so或.dll文件,然后调用其中的函数,实现Java与本地代码的交互。这种方法对于需要高效计算或者利用操作系统特定功能的Java应用非常有用,但同时也增加了...
jnative 1.4 jnative 1.4 jnative 1.4 jnative 1.4 jnative 1.4 jnative 1.4 jnative 1.4 jnative 1.4
为了实现这一目标,Java提供了一个名为JNative的库,它允许Java代码与C/C++编写的本地代码进行交互,从而扩展了Java的功能。本文将深入探讨JNative的工作原理、使用方法以及其在实际应用中的价值。 首先,JNative是...
jnative使用方法总结jnative使用方法总结jnative使用方法总结
4. **示例代码**:提供实际应用的例子,演示如何在Java代码中使用JNative调用本地函数。 **二、源文件** 源文件包含JNative库的所有源代码,这对于理解其内部工作原理、调试或自定义功能至关重要。源文件可能包含...
使用JNative时,首先需要在Java代码中引入JNative.jar库,然后通过JNative提供的API创建本地方法句柄,这个句柄可以用来调用本地函数。例如,我们可以创建一个`LoadLibrary`方法来加载本地库,接着定义`...
3. **方法映射**:JNative内部会将Java的native方法名转换为符合C/C++的函数调用约定的名称,实现Java方法与本地函数的映射。 4. **参数传递**:JNative处理Java对象到C/C++数据类型的转换,确保参数能正确传递给...