java中调用c语言使用JNI,有没有高手知道C语言中的回调函数在JAVA中如何实现?拜谢了!比如C语言一个函数实现:hal_c_register(int p , void callback(int index,char *data, int len));java中要调用hal_c_register函数,该怎么调用?不知道怎么传参数,请高手指教。 

解决方案 »

  1.   

    采用JNA来解决这个问题比较方便 ,方法如下:
    1.先把你的才程序编译成动态库(windows下,dll文件)或共享库(Linux下,.so文件)
    2.使用com.sun.jna.Callback解决C中的回调函数,实现com.sun.jna.Library接口,封装C函数JNA的具体用法可以搜一下 
      

  2.   

    现在使用的是JAVA VM,所以采用了JNI,没有去使用JNA,能不能说一下JNI如何实现?
      

  3.   

    JNI 下面我的例子中 我觉得你应该在第3步的时候 实现方法内部调用你说的那个hal_c_register(int p , void callback(int index,char *data, int len));
    方法。JNI : JAVA Native Interface 简称JAVA 本地调用,允许Java代码和其他语言写的代码进行交互范例:     1、编写一个包含本地声明的方法类,例如:
         public class HelloWorld{
             public native static int MyMethod();//本地方法
         }
         编译生成class文件     2、生成C语言下的方法
         使用javah 命令生成MyMethod方法的c文件头:HelloWorld.h
         /* DO NOT EDIT THIS FILE - it is machine generated */
         #include <jni.h>
         /* Header for class HelloWorld */     #ifndef _Included_HelloWorld
         #define _Included_HelloWorld
         #ifdef __cplusplus
          extern "C" {
         #endif
         /*
         * Class:     HelloWorld
         * Method:    MyMethod
         * Signature: ()I
         */
         JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod
         (JNIEnv *, jclass);     #ifdef __cplusplus
          }
         #endif
         #endif
       
        3、利用vc++ 生成动态链接库 。dll
         创建一个简单的: Win32 Dynamic-link Library 项目 HelloWorldDll
         将生成的HelloWorld.h 引入到项目中
         新建一个HelloWorld。cpp 映入HelloWorld。h  然后实现方法:
         JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod
         (JNIEnv *, jclass)    4、生成dll , 都完成后build该项目,生成dll文件:HelloWorldDll.dll
        5、调用dll。在需要调用HelloWorld中的native方法的类中加载dll。
         public class HelloWorld
         {
         static
         {
            System.loadLibrary("HelloWorldDll");
         }
         }
      

  4.   

    hal_c_register(int p , void (*callback)(int index,char *data, int len));
    这个函数对回调函数的注册,主要是对数据的处理,需要在java中获取结果,如果在第3步调用,java中就无法取得结果了。
      

  5.   

    JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod
      (JNIEnv *, jclass)这里的jint 我想应该就是使用java定义方法后,使用javac转化成C语言的一种类型,我想如果想有返回值,在使用java编写方法时定义好,转化成C代码后,在C的方法内是可以完成返回值设定的。对于C语言我已经好久没碰 不能给建议了。
    hal_c_register(int p , void (*callback)(int index,char *data, int len));
    如果有返回值,那么应该可以处理下 作为转化方法的返回值 应该没有问题,不过应该考虑到这个返回值和java方法返回值类型间的关系
      

  6.   

    还有我的jni只是一个示例:   对已步骤1中的本地方法:public native static int MyMethod();//本地方法
       返回值为int型, 本地方法还可以是其他基本类型,如果返回值是对象我想可能就要关联到C语言,基本类型作为返回值实现起来感觉还是可以的,但是对象的话我就没有测试过了,不知道能否实现。   不过如果想返回复杂的信息,我觉得string能够实现,之前有过这方面的经历,java和4gl语言之间的调用,对于复杂的要返回对象类型的需求通常都是以字符串返回(这里的字符串是需要转化成特定格式的),在调用后返回结果也是字符串,对返回的字符串解码后生成需要的对象。
      

  7.   

    我觉得你调用dll 并且产生返回值的需求是可以实现的。你再看看 
      

  8.   

    给LZ推荐一个JNI的使用,有源码和大量注释,LZ一定要试下:
    http://download.csdn.net/detail/txzsp/2285294