求助关于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