目前,我手上有个项目,需要用java编写程序,调用一个硬件厂家提供的接口文件;
该文件用c语言写的,一共是1个.lib文件和一个.h文件,
这个h文件中有控制硬件的方法
我应该怎么样写程序去调用h文件中的方法呢???

解决方案 »

  1.   

    jni技术,你要针对java开发与C接口通信的C中间层。
      

  2.   

    2楼的,问一下
    jni我听说过,Google了以后,发现,都是写一个类,用类生成了h文件...然后把h文件生成dll文件..最后调用,但是,给定的h文件怎么弄啊??还有你说的中间层是什么意思??
      

  3.   

    没做过
    楼主参考下这个
    http://blog.csdn.net/eqxu/archive/2006/06/09/783340.aspx
      

  4.   

    http://topic.csdn.net/t/20031225/10/2600974.html
    看看这个实例
      

  5.   

    自己用c写一个中间层,调用厂家提供的接口。并提供给java调用。
      

  6.   

    8楼的意思,是不是,写一个规范的,符合要求的h文件,同时这个h文件中调用给定的h文件呢
      

  7.   

    这个我现在也在弄,调用dll文件,我也不懂c。
    估计你这个需要自己写dll
    有了dll就好办了
    用jni很麻烦,我弄了几天发现有个更好的。
    有个开源的jnative(jna),这个很好用,现在出1.4版本了。
    我找了一堆资料,jni的,jawin的,jnative的
    如果要的话我可以打包发给你
      

  8.   

    调用示例
    很简单的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();
    }
    }
    }
      

  9.   

    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帮助文档的英文版本中有,记住,英文版本,中文版本没有这个方面的文档)
      

  10.   

    对了,再次提醒楼主,C程序是需要回收内存的,不然你的java程序会出现内存泄漏而导致内存溢出异常。
      

  11.   

    ymdcr
    你可以给我发个邮件吗??163开通了邮箱聊天....
      

  12.   

    用JNA容易上手,能解决不少问题。但若应用深入下去,尤其是dll中数据类型是用户自定义或较复杂或
    与JAVA类型差异较大时,你将会悲哀地发现,你陷进了泥潭中。
    此时只有JNI能救你。你还是应该知道JNI,其实它不难,却很有用。许多场合在厂商dll与你的JAVA代码之间,用JNI时只有你的薄薄的一层你的DLL,而用JNA,是一个大的DLL。以上仅供你参考。但愿你不会“陷进了泥潭中”。