我现在要用java调用一个C++的dll
求各位大神帮帮忙急。
我找了一下网上的资料,说是用System.load或者System.LoadLibrary两个方法
但是,各种搞不定啊~~
我使用了一个SC.dll 其中有一个方法是   int ScYFScMessage(char* PicPath);求助一下,我怎么才能正确的调用到这个方法啊~

解决方案 »

  1.   

    用JNI做。
    具体步骤:
    1 写一个Java类,有一个方法
    public native int scYFScMessage(String picPath)
    2 用javah命令得到h头文件
    3 实现C++代码。如果你有源码,改造源码使其符合h头中方法签名。如果没有源码,在C++中调用自己的SC.dll库。
      

  2.   

    回复2楼我只有一个SC.dll 没有C++源码的。
    你这个意思我还是不是很明白。我对这个不是很了解,麻烦能解释清楚一点吗?
    我如果写了一个 native 的方法,还要用javah得到头文件干什么?
    而且,为什么还要在C++中实现代码?这个方法已经在SC.dll中实现了啊。、
    再说,如果我在C++中实现了,又怎么在java中调用呢?纠结啊,纠结啊 ,。。菜鸟不懂的太多了~
      

  3.   

    你需要看看JNI的资料。
    因为Java只能访问符合JNI规范的动态链接库,所以在你的DLL不符合JNI规范这个前提下,你只能为你的DLL开发一个符合JNI规范的包装器DLL。你的其他java程序调用上述java类中的native方法,native方法调用包装器DLL,包装器DLL调用SC.dll。
      

  4.   

    OK,刚想了一下,可能JNA是更好的选择,LZ可以试试,要简单些,但不知道管不管用。
    参照
    http://blog.csdn.net/shendl/archive/2008/12/23/3589676.aspx
      

  5.   

    非常感谢。
    我试了JNA,但是不知道什么原因,出现堆栈溢出的错误。An unrecoverable stack overflow has occurred.
    #
    # An unexpected error has been detected by HotSpot Virtual Machine:
    #
    #  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x0be73fa7, pid=2228, tid=3384
    #
    # Java VM: Java HotSpot(TM) Client VM (1.5.0_12-b04 mixed mode)
    # Problematic frame:
    # C  [SC.dll+0x13fa7]我搞了好久都不明白这个错误是怎么回事。能帮忙看一下么?
      

  6.   

    我的DLL我在VC里面用过了,都没有问题啊~
    而且,以前还用C#写过一个东西。也是用的这个DLL,都没有问题的嘛。
      

  7.   

    占楼+学习
    话说,Java调动态库一直是一个麻烦的问题。
      

  8.   

    我把帖子结了。
    问题原因已经找到了。
    我在C++中使用的是BYTE类型,也就是说用的是unsigned byte。储存数据范围是0-255
    但是java中没有unsigned byre 类型。byte的储存范围是-127-128
    所以导致了堆栈溢出。我正在想办法解决这个问题。
    感谢大家回答