- 浏览: 179480 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
donggongai:
Blackbaby 写道mazhi4562qq 写道moist ...
openfire集成现有系统的用户表 -
Blackbaby:
mazhi4562qq 写道moistrot 写道哥们,你集成 ...
openfire集成现有系统的用户表 -
mazhi4562qq:
moistrot 写道哥们,你集成成功了吗?我这样集成之后,登 ...
openfire集成现有系统的用户表 -
dxcsingle:
哥们 我如今也遇到这个问题 能讲哈怎么处理么?
openfire集成现有系统的用户表 -
hooktoo:
该例子有很严重的问题,java没释放内存
JNative dll回调函数使用实例
JNative是供java直接调用c++dll的工具包,这样java程序员仅仅知道c++dll中的函数名和参数类型就可以直接调用dll 了,省去了使用JNI的繁琐。
下面是一个使用c++dll回调函数的例子:
dll名字JNativeTest.dll
C++代码:
JNativeTest.h:
#ifndef JNativeTes_H #define JNativeTes_H /** The following ifdef block is the standard way of creating macros which make exporting * from a DLL simpler. All files within this DLL are compiled with the JNATIVETEST_EXPORTS * symbol defined on the command line. this symbol should not be defined on any project * that uses this DLL. This way any other project whose source files include this file see * JNATIVETEST_API functions as being imported from a DLL, wheras this DLL sees symbols * defined with this macro as being exported. **/ #ifdef JNATIVETEST_EXPORTS #define JNATIVETEST_API extern "C" __declspec(dllexport) #else #define JNATIVETEST_API __declspec(dllimport) #endif typedef void (*pfCallbackTest)(char * msg, char* data, int type); /*回调函数声明*/ // This class is exported from the JNativeTest.dll JNATIVETEST_API char* fnJNativeTest(char* msg); JNATIVETEST_API void RegCallback(pfCallbackTest ev); #endif
JNativeTest.cpp :
// JNativeTest.cpp : Defines the entry point for the DLL application. #include <windows.h> #include "JNativeTest.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } pfCallbackTest fCallbackTest = NULL; /*注册回调*/ void RegCallback(pfCallbackTest ev) { fCallbackTest = ev; } // This is an example of an exported function. char* fnJNativeTest(char* msg) { if (fCallbackTest != NULL) fCallbackTest(msg, "Test", 6); /*调用回调函数*/ return msg; }
java代码:
TestCallback.java
import org.xvolks.jnative.JNative; import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.pointers.*; import org.xvolks.jnative.util.Callback; /** * @date 2009-3-17 * @author charis * @Copyright (c) qqtech All rights reserved. http://www.qqtech.com */ public class TestCallback implements Callback/*实现此接口*/ { public TestCallback() { } /** * Method callback * java对应于dll中的回调函数 * @param values an long[] 参数数组,非整型数代表的都是地址 * @return an int * @version 3/17/2008 */ public int callback(long[] values) { if (values == null) { System.err.println("callback ret " + 3); return 3; } if (values.length == 3) { String name = ""; try { Pointer _pointer = Pointer.createPointerToNativeMemory((int) values[0], 100); /*获取字符串通过指针*/ Pointer _pointer1 = Pointer.createPointerToNativeMemory((int) values[1], 100); name = _pointer.getAsString() + "/" + _pointer1.getAsString(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.err.println("lParam " + name + "/" + values[2]); return 1; } else { System.err.println("Bad number of arguments ! 3 expected "+values.length+" found"); System.err.println("callback ret " + 2); return 2; } } /** * java回调函数地址 */ public int getCallbackAddress() throws NativeException { return JNative.createCallback(3/*回调函数参数数目*/, this); } }
TestMain.java
import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type; /** * @date 2009-3-10 * @author charis * @Copyright (c) qqtech All rights reserved. http://www.qqtech.com */ public class TestMain{ public TestMain(){ } public static void main(String[] args) { // TODO Auto-generated method stub try { JNative termcallback = new JNative("JNativeTest.dll", "RegCallback" /*函数名*/ ); TestCallback _callback = new TestCallback(); termcallback.setRetVal(Type.VOID); termcallback.setParameter(0, _callback.getCallbackAddress()); /*回调函数地址作为参数传递到dll*/ /** * 调用getCallbackAddress后要调用该行代码 */ JNative.releaseCallback(_callback); termcallback.invoke(); /*注册回调函数*/ JNative term = new JNative("JNativeTest.dll", "fnJNativeTest"/*函数名*/); term.setRetVal(Type.STRING); /*返回值类型*/ term.setParameter(0, "hello word!"); /*左起第一个参数,索引为0*/ term.invoke(); String value = term.getRetVal(); System.out.println(value); term.setParameter(0, "hello word second!"); term.invoke(); value = term.getRetVal(); System.out.println(value); } catch (Exception e) { e.printStackTrace(); } } }
注意 :
当调用dll回调函数失败时,请检查参数数目和参数类型,并请c++程序员核对dll中回调函数的声明。
如此typedef void (WINAPI *pfCallbackTest)(char * msg, char* data, int type)声明将会引起调用失败
原文链接:http://hi.baidu.com/chinacharis/blog/item/87ef7f00b0b092067bec2cfb.html
发表评论
-
FreeMarker 模板文件 路径设置
2013-09-23 16:17 15551.freemarker 模板文件路径设置 ... -
关于JVM说明的摘要
2012-03-15 15:00 928If the JVM is launched w ... -
Disabling Certificate Validation in an HTTPS Connection
2011-12-09 13:49 1159final static HostnameVerifi ... -
[Maven]eclipse中的java项目转化成java ee项目
2011-11-22 15:25 1004mvn eclipse:eclipse -Dwtp ... -
Base62
2011-11-19 11:10 1568public class Base62 { pri ... -
How do I use Form Authentication with Tomcat?
2011-04-27 21:27 912web.xml <?xml vers ... -
poi 解析excel
2011-04-06 18:13 1331package com.synnex.web.c ... -
Ant with Maven environment
2011-02-16 14:36 893<?xml version="1.0" ... -
How can I setup my BlazeDS implementation with Log4J?
2011-01-25 16:09 880Out of box BlazeDS does no ... -
windows批处理命令执行java程序
2011-01-17 23:23 1580window auto.bat文件内容: ... -
How to specify firstDayOfWeek for java.util.Calendar using a JVM argument
2011-01-14 22:47 827Question: I'm trying t ... -
收集的工具方法
2011-01-09 23:19 817package org.codehaus.jackson.ut ... -
Creating a Thread Pool with Java
2010-12-19 22:08 1108As you can see, a thread pool i ... -
JBoss-4.2.3GA配置MySQL数据库连接池
2010-07-23 10:30 13051.将mysql的JDBC驱动放到的JBOSS_HOME\se ... -
svn插件导致eclipse崩溃
2010-06-10 10:19 1149从 http://subclipse.tigris.org/u ... -
Web 开发中的调试利器--tcptrace
2010-04-16 10:41 962Web 开发中的调试利器--tcptrace -
Tomcat6 Support JTA with JOTM
2010-04-07 11:47 17971 jotm jars into tomcat6/lib ... -
Fire Workflow工作流脚本
2010-03-10 16:43 924Fire Workflow 中的七张表脚本: Orale: ... -
java实现类似函数式语言的map/filter功能
2010-03-02 23:13 1087http://www.jdon.com/jivejdon/th ... -
comet网站
2010-01-07 15:20 138http://www.lightstreamer.com/ ...
相关推荐
一个简单的jnative调用dll例子,因为网上找到java的都不包含dll代码,所以自己研究弄了个简单例子
Jnative调用DLL进行开发的具体代码
TestJNative_Eclipse.rar 为MyEclipse工程 JNativeTest_VC.rar为VC ...主要写了一些JNative调用DLL的例子,包含了JNative回调函数的用法与指针的用法,以供参考,希望对使用JNative的开发人员有帮助 有问题大家一起讨论
java利用jnative调用DLL.txt
NULL 博文链接:https://unifocus.iteye.com/blog/678463
jnative框架调用dll动态库-简单demo(带dll文件)
包括了JNative.jar包和JNativeCpp.dll,还有一个libJNativeCpp.so文件
jnative使用方法总结jnative使用方法总结jnative使用方法总结
包含jna.jar,JNative.jar,jinvoke.jar,VC++创建DLL例子,VC++调用DLL例子,JAVA、JNA、JNative、jinvoke调用DLL例子
JNative.jar , JNativeCpp.dll ,libJNativeCpp.so,java通过JNative调用动态dll所需的文件jar
包含jna.jar,JNative.jar,VC++创建DLL例子,VC++调用DLL例子,JAVA-JNA、JNative调用DLL例子
jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so 免费下载jNative.jar jNativeCpp.dll libjNativeCpp.so ...
jnative jnative jnative jnative
jna和jnative的一个简单示例工程,包含jna和jnative的jar包,还有jna的chm api文档以供参考。其中.dll是的函数是求两个数的较大值。这是我初入学习java访问.dll做的一个示例。
jnative包用于调用dll动态库,目前(2011-12-20)最新版本为1.4RC2,官方正式版本文档为1.3,详见官方地址: http://jnative.free.fr/docs/ 这是最新的帮助文档HTML离线包,希望对大家有帮助 Packages org.xvolks....
jnative 源码及dll文件,包含c++源码
因为项目的需求,要在JAVA项目中调用Windows的Dll,之前用Jni调用过C写的Dll文件,比较麻烦,后在网上找到一个开源的组件JNative,使用后感觉比较方便。
JAVA调用动态链接库DLL之JNative学习源码,详细请参考:http://blog.csdn.net/testcs_dn/article/details/26980027
这是项目中用到的java掉用本地动态链接库(DLL)的一个例子,用了JNative Jar包