项目需要从DLL中调用方法,但是接口是JAVA程序,目前只知道DLL中的方法名和参数,貌似不能用JNI来实现。
在百度中搜索的资料很有限,只晓得可以用jawin这个工具来实现。目前只有一个例子import org.jawin.funcptr;
import org.jawin.returnflags;
public class createppt {
       public static void main(string[] args) {
              try {
                     funcptr msgbox = new funcptr("user32.dll", "messageboxw");
                     msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
              } catch (exception e) {
                     e.printstacktrace();
              }
可怜我才学了1个星期JAVA就遇到这个棘手的问题,熟悉jawin的大大能解释一下这个类吗?

解决方案 »

  1.   

    jawin 可以对dll中的方法进行调用,也可以调用com中的方法.下载jawin:http://jawinproject.sourceforge.net/。将jawin.jar放于%JAVA_HOME%\jre\lib\ext下 。
    将jawin.dll放于c  win32下。      
      

  2.   

    例子很多参考http://tag.csdn.net/tag/jawin/1.html
      

  3.   

    例子好像都是一样的,就是我贴的这个。。
    我是这么理解的,不知道对不对
     funcptr msgbox = new funcptr("user32.dll", "messageboxw");
     msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false); 
    这2句中,messageboxw是user32.dll中的方法。
    msgbox.invoke()是将参数传给方法messageboxw。
      

  4.   


    import org.jawin.funcptr; 
    import org.jawin.returnflags; 
    public class createppt { 
           public static void main(string[] args) { 
                  try { 
                         funcptr msgbox = new funcptr("user32.dll", "messageboxw"); //获得函数指针
                         msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false); 
    /*1.     指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。其指令字符串为:IIP16G:I:L4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。2.     传入参数的总字节大小。3.     前面写好的传入参数的原始字节流。4.     一个object数组。5.     ReturnFlags,用以根据C/C++返回值将C/C++的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。*/
                  } catch (exception e) { 
                         e.printstacktrace(); 
                  } 
      

  5.   

    还有个问题,DLL文件应该放在那个路径中呢?
      

  6.   

    谢谢ProvidenceZY,请教一下,如果我的DLL中有方法:
    UDPPwd(String snh, String pwd, String newpwd)这样写对吗?
    funcptr sms = new funcptr("user32.dll", "UDPPwd"); 
    sms.invoke(snh, pwd, newpwd, returnflags.fail_on_false); 
      

  7.   

    是的,楼主的理解是正确的!你可以看一下http://jawinproject.sourceforge.net/jawinuserguide_dll.html
    有什么问题再探讨!