求助关于JNI问题!急!!! java中调用c语言使用JNI,有没有高手知道C语言中的回调函数在JAVA中如何实现?拜谢了!比如C语言一个函数实现:hal_c_register(int p , void callback(int index,char *data, int len));java中要调用hal_c_register函数,该怎么调用?不知道怎么传参数,请高手指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 采用JNA来解决这个问题比较方便 ,方法如下:1.先把你的才程序编译成动态库(windows下,dll文件)或共享库(Linux下,.so文件)2.使用com.sun.jna.Callback解决C中的回调函数,实现com.sun.jna.Library接口,封装C函数JNA的具体用法可以搜一下 现在使用的是JAVA VM,所以采用了JNI,没有去使用JNA,能不能说一下JNI如何实现? 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"); } } 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 问一个哈菜,哈呆的问题 在线等,数据库中插入记录时的乱码问题 jfreechart图片已近生成,但不能在页面显示 请教hibernate interceptor的问题 再次求助:请问上海哪的书便宜? 在spring中如何收集页面中两个以上的对象的输入 想看看日本编程的格式...... struts 框架间传送数据 怎么设置j2ee环境????? 为什么 ejb 不直接 implements bean 的 interface Axis2 请求问题,求教 Struts2 intercepor 问题
1.先把你的才程序编译成动态库(windows下,dll文件)或共享库(Linux下,.so文件)
2.使用com.sun.jna.Callback解决C中的回调函数,实现com.sun.jna.Library接口,封装C函数JNA的具体用法可以搜一下
方法。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");
}
}
这个函数对回调函数的注册,主要是对数据的处理,需要在java中获取结果,如果在第3步调用,java中就无法取得结果了。
(JNIEnv *, jclass)这里的jint 我想应该就是使用java定义方法后,使用javac转化成C语言的一种类型,我想如果想有返回值,在使用java编写方法时定义好,转化成C代码后,在C的方法内是可以完成返回值设定的。对于C语言我已经好久没碰 不能给建议了。
hal_c_register(int p , void (*callback)(int index,char *data, int len));
如果有返回值,那么应该可以处理下 作为转化方法的返回值 应该没有问题,不过应该考虑到这个返回值和java方法返回值类型间的关系
返回值为int型, 本地方法还可以是其他基本类型,如果返回值是对象我想可能就要关联到C语言,基本类型作为返回值实现起来感觉还是可以的,但是对象的话我就没有测试过了,不知道能否实现。 不过如果想返回复杂的信息,我觉得string能够实现,之前有过这方面的经历,java和4gl语言之间的调用,对于复杂的要返回对象类型的需求通常都是以字符串返回(这里的字符串是需要转化成特定格式的),在调用后返回结果也是字符串,对返回的字符串解码后生成需要的对象。
http://download.csdn.net/detail/txzsp/2285294