2014-05-15 23 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