当前位置:编程学习 > JAVA >>

求助关于JNI问题!急!!!

java中调用c语言使用JNI,有没有高手知道C语言中的回调函数在JAVA中如何实现?拜谢了!

比如

C语言一个函数实现:

hal_c_register(int p , void callback(int index,char *data, int len));

java中要调用hal_c_register函数,该怎么调用?不知道怎么传参数,请高手指教。 

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

JNA的具体用法可以搜一下  --------------------编程问答-------------------- 现在使用的是JAVA VM,所以采用了JNI,没有去使用JNA,能不能说一下JNI如何实现? --------------------编程问答-------------------- up by myself! --------------------编程问答-------------------- JNI 下面我的例子中 我觉得你应该在第3步的时候 实现方法内部调用你说的那个hal_c_register(int p , void callback(int index,char *data, int len));
方法。

JNI : JAVA Native Inte易做图ce 简称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");
     }
     } --------------------编程问答-------------------- hal_c_register(int p , void (*callback)(int index,char *data, int len));
这个函数对回调函数的注册,主要是对数据的处理,需要在java中获取结果,如果在第3步调用,java中就无法取得结果了。
--------------------编程问答-------------------- --------------------编程问答-------------------- 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方法返回值类型间的关系 --------------------编程问答-------------------- 还有我的jni只是一个示例:

   对已步骤1中的本地方法:public native static int MyMethod();//本地方法
   返回值为int型, 本地方法还可以是其他基本类型,如果返回值是对象我想可能就要关联到C语言,基本类型作为返回值实现起来感觉还是可以的,但是对象的话我就没有测试过了,不知道能否实现。

   不过如果想返回复杂的信息,我觉得string能够实现,之前有过这方面的经历,java和4gl语言之间的调用,对于复杂的要返回对象类型的需求通常都是以字符串返回(这里的字符串是需要转化成特定格式的),在调用后返回结果也是字符串,对返回的字符串解码后生成需要的对象。 --------------------编程问答-------------------- 我觉得你调用dll 并且产生返回值的需求是可以实现的。你再看看  --------------------编程问答-------------------- 给LZ推荐一个JNI的使用,有源码和大量注释,LZ一定要试下:
http://download.csdn.net/detail/txzsp/2285294
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,