2014-05-15 25 views
4

运行到令人发狂的阻止错误:JNA getFieldOrder()导致在HashSet的不匹配名称()比较(JNA的Structure.java,线925)

Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.luke.generator.GeneratorEngine$VERSION_INFO returns names ([BuildString, ProtocolMajorVer, ProtocolMinorVer]) which do not match declared field names ([BiuldString, ProtocolMajorVer, ProtocolMinorVer]) 

    at com.sun.jna.Structure.getFields(Structure.java:925) 
    at com.sun.jna.Structure.deriveLayout(Structure.java:1058) 
    at com.sun.jna.Structure.calculateSize(Structure.java:982) 
    at com.sun.jna.Structure.calculateSize(Structure.java:949) 
    at com.sun.jna.Structure.allocateMemory(Structure.java:375) 
    at com.sun.jna.Structure.<init>(Structure.java:184) 
    at com.sun.jna.Structure.<init>(Structure.java:172) 
    at com.sun.jna.Structure.<init>(Structure.java:159) 
    at com.sun.jna.Structure.<init>(Structure.java:151) 
    at com.luke.generator.GeneratorEngine$.<init>(GeneratorEngine.java:108) 
    at com.luke.generator.connectionVersion(GeneratorEngine.java:297) 
    at com.luke.generator.Main.main(Main.java:161) 

平台:英特尔,Windows 8的 JRE 1.7, 32位(x86) Eclipse Kepler,默认编码UTF-8 jna-4.1.0.jar 32位CPP DLL--我可以确认我正在加载库并调用不包含参数的函数。我也尝试过传递WString和Strings,但是没有解决这个问题。

来源:

CPP结构:

typedef struct { 
    UINT32 ProtocolMajorVer; 
    UINT32 ProtocolMinorVer; 
    UI_STRING BuildString;  // Build version for the application. 
} VERSION_INFO; 

CPP功能

DLL_EXPORTS RETURN_TYPES ConnectionVersion (VERSION_INFO &Version) {<body omitted>} 

Java代码:

//Interface definition 
public interface UiApi extends StdCallLibrary { 

      UiApi INSTANCE = (UiApi) Native.loadLibrary(UiApiPath,UiApi.class); 

      final String PROTOCOLMAJORVERSION = new String("ProtocolMajorVer"); 
      final String PROTOCOLMINORVERSION = new String("ProtocolMinorVer"); 
      final String BUILDSTRING = new String("BuildString"); 


      public static class VERSION_INFO extends Structure { 

       public static class ByReference extends VERSION_INFO implements Structure.ByReference {} 
       public static class ByValue extends VERSION_INFO implements Structure.ByValue {} 

       public int ProtocolMajorVer; 
       public int ProtocolMinorVer; 
       public byte[] BiuldString; 


       protected List getFieldOrder() { 
         return Arrays.asList(new String[] { "ProtocolMajorVer","ProtocolMinorVer","BuildString" }); 
       } 
      } 

      //Connection 
      public int Connect(byte[] strServerName);  
      public int Disconnect(); 
      public int CloseProject(); 

      public int ConnectionVersion(VERSION_INFO result); 
      public int ConnectionVersion(VERSION_INFO.ByReference result); 
      public int ConnectionVersion(VERSION_INFO.ByValue result); 


    } 

//Engine.connectionVersion() method 
public static int connectionVersion() { 

      int nReturn = 0; 
      String str = new String("This is my build version\n"); 

      UiApi uiapilib; 

      uiapilib = UiApi.INSTANCE; 

      try { 

       UiApi.VERSION_INFO.ByReference result = new UiApi.VERSION_INFO.ByReference(); 


       result.ProtocolMajorVer = 0; 
       result.ProtocolMinorVer = 0; 
       result.BiuldString = str.getBytes(); 

       nReturn = uiapilib.ConnectionVersion(result); 
      } 
      catch (Exception e) { 
       System.out.println("Error=" + e.getLocalizedMessage()); 

      } 

      return nReturn;   

    } 


    //This is the code in main that results in exception 


    private static Engine engine; 

    engine = new GeneratorEngine(); 
    engine.connectionVersion(); 

我必须缺少基本的东西。 Eclipse中是否有可能导致JNA的Structure.java中的HashSet名称比较(第925行),导致名称不匹配?从抛出的异常中,这些定义看起来完全相同。

感谢您提供任何提示,指导,全新的视角。

回答

3

检查你的拼写 - 字段被称为BiuldString而不是BuildString,你有我和你扭转。

+0

通过golly你是对的。我瞪大了眼睛,盯着这个,错过了它。谢谢你的新鹰眼睛。 – user3642809