`
zengguo1988
  • 浏览: 280139 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JNative dll回调函数使用实例

阅读更多

JNative(http://sourceforge.net/projects/jnative/)是供java直接调用c++dll的工具包,这样java程序员仅仅知道c++dll中的函数名和参数类型就可以直接调用dll 了,省去了使用JNI的繁琐。

下面是一个使用c++dll回调函数的例子:

dll名字JNativeTest.dll

  C++代码:

  JNativeTest.h:

 

Java代码 复制代码
  1. #ifndef JNativeTes_H   
  2. #define JNativeTes_H   
  3.   
  4. /** The following ifdef block is the standard way of creating macros which make exporting  
  5. * from a DLL simpler. All files within this DLL are compiled with the JNATIVETEST_EXPORTS  
  6. * symbol defined on the command line. this symbol should not be defined on any project  
  7. * that uses this DLL. This way any other project whose source files include this file see  
  8. * JNATIVETEST_API functions as being imported from a DLL, wheras this DLL sees symbols  
  9. * defined with this macro as being exported.  
  10. **/  
  11. #ifdef JNATIVETEST_EXPORTS   
  12. #define JNATIVETEST_API extern "C" __declspec(dllexport)   
  13. #else  
  14. #define JNATIVETEST_API __declspec(dllimport)   
  15. #endif   
  16.   
  17. typedef void (*pfCallbackTest)(char * msg, char* data, int type); /*回调函数声明*/  
  18.   
  19. // This class is exported from the JNativeTest.dll   
  20.   
  21. JNATIVETEST_API char* fnJNativeTest(char* msg);   
  22.   
  23. JNATIVETEST_API void RegCallback(pfCallbackTest ev);   
  24.   
  25. #endif  
#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

 

Java代码 复制代码
  1. // JNativeTest.cpp : Defines the entry point for the DLL application.   
  2.   
  3. #include <windows.h>   
  4. #include "JNativeTest.h"  
  5.   
  6. BOOL APIENTRY DllMain( HANDLE hModule,   
  7.                        DWORD ul_reason_for_call,   
  8.                        LPVOID lpReserved   
  9.       )   
  10. {   
  11.     switch (ul_reason_for_call)   
  12. {   
  13.     case DLL_PROCESS_ATTACH:   
  14.     case DLL_THREAD_ATTACH:   
  15.     case DLL_THREAD_DETACH:   
  16.     case DLL_PROCESS_DETACH:   
  17.     break;   
  18. }   
  19.     return TRUE;   
  20. }   
  21.   
  22. pfCallbackTest fCallbackTest = NULL;   
  23. /*注册回调*/  
  24. void RegCallback(pfCallbackTest ev)   
  25. {   
  26.      fCallbackTest = ev;   
  27. }   
  28.   
  29. // This is an example of an exported function.   
  30. char* fnJNativeTest(char* msg)   
  31. {   
  32. if (fCallbackTest != NULL)   
  33.    fCallbackTest(msg, "Test"6); /*调用回调函数*/  
  34.    return msg;   
  35. }  
// 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

Java代码 复制代码
  1. import org.xvolks.jnative.JNative;   
  2. import org.xvolks.jnative.exceptions.NativeException;   
  3. import org.xvolks.jnative.pointers.*;   
  4. import org.xvolks.jnative.util.Callback;   
  5.   
  6. /**  
  7. * @date 2009-3-17  
  8. * @author charis  
  9. * @Copyright (c) qqtech All rights reserved. http://www.qqtech.com  
  10. */  
  11. public class TestCallback implements Callback/*实现此接口*/ {   
  12.   
  13. public TestCallback() {   
  14.      
  15. }   
  16. /**  
  17. * Method callback  
  18. * java对应于dll中的回调函数  
  19. * @param values an long[] 参数数组,非整型数代表的都是地址  
  20. * @return an int  
  21. * @version 3/17/2008  
  22. */  
  23. public int callback(long[] values) {   
  24.    if (values == null) {   
  25.     System.err.println("callback ret " + 3);   
  26.     return 3;   
  27.    }   
  28.    if (values.length == 3) {   
  29.     String name = "";   
  30.     try {   
  31.      Pointer _pointer = Pointer.createPointerToNativeMemory((int) values[0], 100); /*获取字符串通过指针*/  
  32.      Pointer _pointer1 = Pointer.createPointerToNativeMemory((int) values[1], 100);   
  33.        
  34.      name = _pointer.getAsString() + "/" + _pointer1.getAsString();   
  35.        
  36.     } catch (Exception e1) {   
  37.      // TODO Auto-generated catch block   
  38.      e1.printStackTrace();   
  39.     }   
  40.     System.err.println("lParam " + name + "/" + values[2]);   
  41.       
  42.       
  43.     return 1;   
  44.    } else {   
  45.     System.err.println("Bad number of arguments ! 3 expected "+values.length+" found");   
  46.     System.err.println("callback ret " + 2);   
  47.     return 2;   
  48.    }   
  49. }   
  50.   
  51. /**  
  52. * java回调函数地址  
  53. */  
  54. public int getCallbackAddress() throws NativeException {   
  55.    return JNative.createCallback(3/*回调函数参数数目*/this);   
  56. }   
  57.   
  58. }  
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

 

Java代码 复制代码
  1. import org.xvolks.jnative.JNative;   
  2. import org.xvolks.jnative.Type;   
  3.   
  4. /**  
  5. * @date 2009-3-10  
  6. * @author charis  
  7. * @Copyright (c) qqtech All rights reserved. http://www.qqtech.com  
  8. */  
  9. public class TestMain{   
  10.   
  11. public TestMain(){   
  12.      
  13. }   
  14.   
  15. public static void main(String[] args) {   
  16.    // TODO Auto-generated method stub   
  17.     try {   
  18.     JNative termcallback = new JNative("JNativeTest.dll""RegCallback" /*函数名*/ );   
  19.     TestCallback _callback = new TestCallback();   
  20.     termcallback.setRetVal(Type.VOID);   
  21.     termcallback.setParameter(0, _callback.getCallbackAddress()); /*回调函数地址作为参数传递到dll*/  
  22.     /**  
  23.     * 调用getCallbackAddress后要调用该行代码  
  24.     */  
  25.     JNative.releaseCallback(_callback);   
  26.     termcallback.invoke(); /*注册回调函数*/  
  27.          
  28.     JNative term = new JNative("JNativeTest.dll""fnJNativeTest"/*函数名*/);   
  29.     term.setRetVal(Type.STRING); /*返回值类型*/  
  30.     term.setParameter(0"hello word!"); /*左起第一个参数,索引为0*/  
  31.     term.invoke();   
  32.     String value = term.getRetVal();   
  33.     System.out.println(value);   
  34.       
  35.     term.setParameter(0"hello word second!");   
  36.     term.invoke();   
  37.     value = term.getRetVal();   
  38.     System.out.println(value);   
  39.       
  40.     } catch (Exception e) {   
  41.     e.printStackTrace();   
  42.    }   
  43.   }   
  44. }  
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

 

分享到:
评论

相关推荐

    在Java程序中使用JNative调用dll文件

    3. **调用DLL函数**:使用JNative提供的API,你可以直接调用DLL中的函数。例如,如果你有一个名为`myFunction`的本地方法,可以使用`JNative.callVoidMethod`或相应的函数进行调用。 4. **错误处理**:由于涉及到...

    简单jnative调用dll例子(含dll代码)

    本教程将通过一个简单的例子来演示如何使用JNI调用DLL动态链接库。 首先,我们需要理解JNI的工作原理。JNI提供了一套接口,使得Java代码可以通过这些接口来调用本地(Native)代码,这里的本地代码可以是C、C++等...

    YiKaTong.rar_JNative_YiKaTong.r_java jnative dll_jnative api_jna

    在这个例子中,`loadLibrary`加载了名为"jnative"的DLL,然后`callDllFunction`就是DLL中的一个函数,它接受一个整数和一个字符串作为参数。 总的来说,JNative提供了一个方便且高效的途径,使得Java开发者能够在不...

    jnative框架调用dll动态库-简单demo(带dll文件).zip

    在Java代码中,使用jnative的`NativeLibrary`类加载DLL,并通过反射获取接口实例以调用DLL函数。例如: ```java public class JNativeDemo { public static void main(String[] args) { // 加载DLL ...

    java利用jnative调用DLL.txt

    // 创建一个JNative实例指向DLL中的Add函数 jnative.setRetVal(Type.INT); // 设置返回值类型为整型 ``` 创建了一个`JNative`实例来指向DLL中的`Add`函数,并设置了返回值类型为整型。 ```java int i = 0; jnative...

    JNative使用示例

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

    JNative.jar和JNativeCpp.dll

    在Windows操作系统上,DLL文件被用来包含可由多个程序同时使用的函数和资源。JNativeCpp.dll很可能包含了实际的C++实现,这些实现对应于JNative.jar中声明的原生方法。当Java应用程序通过JNI调用这些方法时,...

    JNA.jar-JNative.jar-jinvoke.jar-dll创建-JAVA调用-VC调用

    `TestJNA.java`文件可能包含了一个使用JNA调用`CreateDLL.dll`中的函数的例子。 其次,`JNative.jar`是另一个用于Java本地调用的库,它通过JNI接口实现。相比于JNA,JNative提供了更底层的控制,但需要编写JNI代码...

    Java调用DLL的工具 JNative

    4. **映射函数**:使用JNative的API,将Java接口与DLL中的函数进行映射。这样,当你在Java代码中调用接口方法时,实际是在调用DLL中的相应函数。 5. **调用DLL函数**:现在,你可以像调用普通Java方法一样调用DLL...

    java调用DLL:JNative

    下面通过一个具体的例子来展示如何使用JNative框架调用DLL中的函数。 #### 示例场景 假设我们需要编写一个Java程序,该程序调用名为`TestAppSvr.dll`的DLL文件中的`TestConnect()`函数来检测某个应用服务器的状态...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    `JNative.jar`包含了JNative的实现,`TestJNative.java`是使用JNative调用DLL的示例。 3. **VC++创建DLL**: `CreateDLL.dll`是由Visual C++(VC++)编译生成的动态链接库,通常包含了一些可供其他程序调用的函数...

    jnative使用方法总结

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

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    JAVA调用动态链接库DLL之JNative学习源码

    本教程将围绕如何使用`JNative`来调用DLL进行深入讲解。 首先,我们要理解Java和DLL之间的交互原理。Java本身不支持直接调用本地库,但通过JNI(Java Native Interface)可以实现这种跨语言调用。JNI提供了一种方式...

    JNative相关jar包和dll ,so文件.zip

    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.rar

    4. **实例化接口**:通过JNative,Java会自动创建接口的实例,并将其绑定到DLL中的相应函数。 5. **调用函数**:通过接口实例调用DLL中的函数,就像调用普通的Java方法一样。 6. **处理结果**:接收并处理函数返回...

    java使用JNative调用动态连接库实例[文].pdf

    以下是一个关于如何使用JNative调用DLL函数的实例,主要涉及到两个关键函数:`EncryptPswStr`和`DecryptPswStr`,以及一个辅助函数`NotifyReadMeter`。 1. **加密与解密函数**: - `EncryptPswStr`:该函数用于...

    jnative简单的使用

    一个简单的例子是通过JNative调用本地C代码计算两个整数的最大值: ```java public interface NativeMath { int max(int a, int b); } ``` 生成的C代码: ```c JNIEXPORT jint JNICALL Java_NativeMath_max...

    jna和jnative访问.dll的一个示例

    jna和jnative的一个简单示例工程,包含jna和jnative的jar包,还有jna的chm api文档以供参考。其中.dll是的函数是求两个数的较大值。这是我初入学习java访问.dll做的一个示例。

    jnative源码和文档,包含JNativeCpp.dll和libJNativeCpp.so

    本文将围绕JNative的核心概念、工作原理以及如何使用JNativeCpp.dll和libJNativeCpp.so这两个关键组件进行详细讲解。 首先,理解JNative的工作原理至关重要。JNative基于Java的JNI(Java Native Interface)规范,...

Global site tag (gtag.js) - Google Analytics