在线等,跪求java调用c语言的h文件的方法 目前,我手上有个项目,需要用java编写程序,调用一个硬件厂家提供的接口文件;该文件用c语言写的,一共是1个.lib文件和一个.h文件,这个h文件中有控制硬件的方法我应该怎么样写程序去调用h文件中的方法呢??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 jni技术,你要针对java开发与C接口通信的C中间层。 2楼的,问一下jni我听说过,Google了以后,发现,都是写一个类,用类生成了h文件...然后把h文件生成dll文件..最后调用,但是,给定的h文件怎么弄啊??还有你说的中间层是什么意思?? 没做过楼主参考下这个http://blog.csdn.net/eqxu/archive/2006/06/09/783340.aspx http://topic.csdn.net/t/20031225/10/2600974.html看看这个实例 自己用c写一个中间层,调用厂家提供的接口。并提供给java调用。 8楼的意思,是不是,写一个规范的,符合要求的h文件,同时这个h文件中调用给定的h文件呢 这个我现在也在弄,调用dll文件,我也不懂c。估计你这个需要自己写dll有了dll就好办了用jni很麻烦,我弄了几天发现有个更好的。有个开源的jnative(jna),这个很好用,现在出1.4版本了。我找了一堆资料,jni的,jawin的,jnative的如果要的话我可以打包发给你 调用示例很简单的import org.xvolks.jnative.JNative;import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException;public class TestJNA { public static void main(String[] args) { try { JNative jn = new JNative("calc1.dll", "Calc_Add"); jn.setRetVal(Type.INT); jn.setParameter(0, 111); jn.setParameter(1, 254); jn.invoke(); int result = Integer.parseInt(jn.getRetVal()); System.out.println(result); } catch (NativeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }} jni开发过程是这样的。首先开发java的时候,吧需要调用C接口的方法加上native关键字,并且不需要方法体。然后通过javah命令执行这个java源文件(我不太记得是.java还是.class)。执行以后得到一个.h文件(这个文件相当于java里面的接口)然后你再自己编写.c文件(这个文件相当于java里面的实现那个.h接口文件的类),吧.h文件在C中引入,把.h里面的方法原封不动的复制到.c文件里面,并逐一加上方法体然后自己实现方法体里面的执行过程。然后你自己写的.c文件中的执行过程是用c语言实现的,就可以调用你提供的dll文件了,如果dll文件没有提供.h与lib文件,那你只能用函数指针来完成.dll文件的调用。当你开发完成以后,用cl命令编译.c文件成dll动态连接库文件,然后吧这个文件放在项目根目录下或者%jdk%\bin目录下。然后在你的.java代码中加入如下语句 static { System.loadLibrary("你的动态连接库文件名称,省略掉dll后缀"); }做jni开发,你必须会编写C语言程序,会调用jni提供的函数(这些函数的用法在jdk帮助文档的英文版本中有,记住,英文版本,中文版本没有这个方面的文档) 对了,再次提醒楼主,C程序是需要回收内存的,不然你的java程序会出现内存泄漏而导致内存溢出异常。 ymdcr你可以给我发个邮件吗??163开通了邮箱聊天.... 用JNA容易上手,能解决不少问题。但若应用深入下去,尤其是dll中数据类型是用户自定义或较复杂或与JAVA类型差异较大时,你将会悲哀地发现,你陷进了泥潭中。此时只有JNI能救你。你还是应该知道JNI,其实它不难,却很有用。许多场合在厂商dll与你的JAVA代码之间,用JNI时只有你的薄薄的一层你的DLL,而用JNA,是一个大的DLL。以上仅供你参考。但愿你不会“陷进了泥潭中”。 关于java里的正则表达式--* 请问如何判断一个集合中,某个元素的值的个数 正则表达式的小问题 eclipse是否自带了JDK和JRE,如果不是,那是否要去官网分别下载JDK和JRE Gui事件问题 请问awt中有没有能够显示HTML的类 eclipse想说爱你是不容易的事 帮忙看看是什么错误? break语句 *****高分请教基于WEB的自动点歌系统的实现原理******* 怎么将自己所写的一个网站链接到一个申请的一个二级域名上!!! 两种赋值方式的比较
jni我听说过,Google了以后,发现,都是写一个类,用类生成了h文件...然后把h文件生成dll文件..最后调用,但是,给定的h文件怎么弄啊??还有你说的中间层是什么意思??
楼主参考下这个
http://blog.csdn.net/eqxu/archive/2006/06/09/783340.aspx
看看这个实例
估计你这个需要自己写dll
有了dll就好办了
用jni很麻烦,我弄了几天发现有个更好的。
有个开源的jnative(jna),这个很好用,现在出1.4版本了。
我找了一堆资料,jni的,jawin的,jnative的
如果要的话我可以打包发给你
很简单的import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;public class TestJNA {
public static void main(String[] args) {
try {
JNative jn = new JNative("calc1.dll", "Calc_Add");
jn.setRetVal(Type.INT);
jn.setParameter(0, 111);
jn.setParameter(1, 254);
jn.invoke();
int result = Integer.parseInt(jn.getRetVal());
System.out.println(result);
} catch (NativeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先开发java的时候,吧需要调用C接口的方法加上native关键字,并且不需要方法体。
然后通过javah命令执行这个java源文件(我不太记得是.java还是.class)。
执行以后得到一个.h文件(这个文件相当于java里面的接口)
然后你再自己编写.c文件(这个文件相当于java里面的实现那个.h接口文件的类),吧.h文件在C中引入,把.h里面的方法原封不动的复制到.c文件里面,并逐一加上方法体然后自己实现方法体里面的执行过程。
然后你自己写的.c文件中的执行过程是用c语言实现的,就可以调用你提供的dll文件了,如果dll文件没有提供.h与lib文件,那你只能用函数指针来完成.dll文件的调用。
当你开发完成以后,用cl命令编译.c文件成dll动态连接库文件,然后吧这个文件放在项目根目录下或者%jdk%\bin目录下。
然后在你的.java代码中加入如下语句
static
{
System.loadLibrary("你的动态连接库文件名称,省略掉dll后缀");
}做jni开发,你必须会编写C语言程序,会调用jni提供的函数(这些函数的用法在jdk帮助文档的英文版本中有,记住,英文版本,中文版本没有这个方面的文档)
你可以给我发个邮件吗??163开通了邮箱聊天....
与JAVA类型差异较大时,你将会悲哀地发现,你陷进了泥潭中。
此时只有JNI能救你。你还是应该知道JNI,其实它不难,却很有用。许多场合在厂商dll与你的JAVA代码之间,用JNI时只有你的薄薄的一层你的DLL,而用JNA,是一个大的DLL。以上仅供你参考。但愿你不会“陷进了泥潭中”。