`
reasonsoft
  • 浏览: 48115 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jnative callback 回调函数的实现

    博客分类:
  • java
阅读更多
    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();

	}

}
分享到:
评论
2 楼 winmap 2015-06-04  

import jnative.wrapper.JnaWrapperHandler; 
import jnative.wrapper.JnativeBase; 

你导入的这几个包是私有的吗,能否提供。
1 楼 hyint 2009-02-16  
哥们,你的这个帖子,还是有点不明白啊!我想请教你一些问题,希望你能帮帮忙啊!我的QQ:51563163

相关推荐

    JNative使用示例

    TestJNative_Eclipse.rar 为MyEclipse工程 JNativeTest_VC.rar为VC ...主要写了一些JNative调用DLL的例子,包含了JNative回调函数的用法与指针的用法,以供参考,希望对使用JNative的开发人员有帮助 有问题大家一起讨论

    JNative.jar以及JNative源码

    本文将详细介绍JNative.jar及其相关组件,以及如何利用JNative源码来实现跨平台的本地方法调用。 首先,我们来看JNative.jar。这是一个关键的库文件,它包含Java Native Interface (JNI) 的实现,使得Java代码可以...

    Jnative资源包源码

    Jnative利用JNI接口,创建了简单的API,使得开发者无需深入了解JNI的底层机制,就能轻松地调用本地函数。 2. 注解驱动:Jnative引入了注解(Annotation)的概念,通过在Java代码中添加特定的注解,可以声明本地方法...

    JNative v1.3 docs

    jnative包用于调用dll动态库,目前(2011-12-20)最新版本为1.4RC2,官方正式版本文档为1.3,详见官方地址: http://jnative.free.fr/docs/ 这是最新的帮助文档HTML离线包,希望对大家有帮助 Packages org.xvolks....

    JNative用java调用动态库VC++

    JNative 的优点在于它的易用性、数据类型处理的高效以及对回调函数的支持。在使用JNative之前,我们需要了解一些基本概念。例如,`libJNativeCpp.so`是适用于Linux平台的动态链接库,而`JNativeCpp.dll`则适用于...

    利用JNative实现Java调用动态库.pdf

    利用JNative实现Java调用动态库.pdf

    JNative api说明文档

    JNative是Java平台上的一个库,它允许Java程序直接调用本地(C/C++)代码,实现了Java与原生代码的无缝交互。通过JNative,开发者可以利用Java的跨平台优势,同时结合原生代码的高效性能,解决Java在特定场景下性能...

    JNative.jar 包

    它们实现了与JNative.jar中的Java接口相对应的本地方法,使得Java代码可以通过JNI桥接调用这些本地函数。 使用JNative.jar包的过程通常包括以下几个步骤: 1. **创建本地方法声明**:在Java类中声明本地方法,使用...

    org.xvolks.jnative 源码

    1. **本地库加载**:`JNativeCpp.dll`和`libJNativeCpp.so`分别是Windows和Linux平台上的本地库,它们实现了与Java层交互的函数。`org.xvolks.jnative`在运行时会根据操作系统类型自动加载对应的库,并通过JNI函数...

    JNative完全自学手册

    JNative是Java Native Interface的缩写,允许Java程序调用本地函数库,实现Java程序与本地代码的交互。本手册将带领读者深入探索JNative技术的核心知识点。 第一步:编写Java代码 我们首先编写Java代码,创建一个名...

    JNative综合学习资料

    JNative是Java的一个开源库,通过JNI(Java Native Interface)提供了一种方便的方式来实现Java与C/C++代码的交互。它简化了JNI的使用,使得开发者可以更加专注于业务逻辑,而不是底层的接口实现。JNative的出现,极...

    jnative

    这里我们关注的工具是`jnative`,它是一个Java本地接口(Java Native Interface,JNI)的实现,允许Java代码直接调用C++编写的动态链接库(DLL)或共享库(如libJNativeCpp.so在Linux系统中)。这个过程涉及的知识点...

    JNative-1.3.2.zip

    JNative正是这样一个工具,它允许Java程序无缝地调用本地(Native)代码,尤其是动态链接库(DLL)中的函数。JNative-1.3.2.zip这个压缩包包含的资源,正是实现这一目标的关键组件。 JNative.jar是JNative的核心库...

    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 jnative 1.4

    jnative.rar

    为了实现这一目标,Java提供了一个名为JNative的库,它允许Java代码与C/C++编写的本地代码进行交互,从而扩展了Java的功能。本文将深入探讨JNative的工作原理、使用方法以及其在实际应用中的价值。 首先,JNative是...

    jnative使用方法总结

    jnative使用方法总结jnative使用方法总结jnative使用方法总结

    Jnative 1.4 API

    4. **示例代码**:提供实际应用的例子,演示如何在Java代码中使用JNative调用本地函数。 **二、源文件** 源文件包含JNative库的所有源代码,这对于理解其内部工作原理、调试或自定义功能至关重要。源文件可能包含...

    JNative.jar

    使用JNative时,首先需要在Java代码中引入JNative.jar库,然后通过JNative提供的API创建本地方法句柄,这个句柄可以用来调用本地函数。例如,我们可以创建一个`LoadLibrary`方法来加载本地库,接着定义`...

    JNative Java调用动态链接库jar包

    3. **方法映射**:JNative内部会将Java的native方法名转换为符合C/C++的函数调用约定的名称,实现Java方法与本地函数的映射。 4. **参数传递**:JNative处理Java对象到C/C++数据类型的转换,确保参数能正确传递给...

Global site tag (gtag.js) - Google Analytics