2013-06-27 58 views
0

我定義了一個枚舉象下面這樣:爲什麼JNI在枚舉中找不到自定義靜態?

public enum EventType { 
    UPDATE(0), ADD(1), REMOVE(2), RESPONSE(3); 

    private Integer id; 

    public Integer id() { 
     return this.id(); 
    } 

    /** 
    * constructor method 
    */ 
    EventType(Integer id) { 
     this.id = id; 
    } 

    public static EventType getInstance(Integer id) { 
     switch (id) { 
      case 0: 
       return UPDATE; 
      case 1: 
       return ADD; 
      case 2: 
       return REMOVE; 
      case 3: 
       return RESPONSE; 
      default: 
       return null; 
     } 
    } 
} 

我想創建的回調getInstance方法一個枚舉的實例,如下面的JNI代碼:

jclass eventType_cls = (*env)->FindClass(env,"com/example/hellojni/EventType"); 
jmethodID midInstance = (*env)->GetStaticMethodID(env,eventType_cls,"getInstance","(I)[Lcom/example/hellojni/EventType;"); 

它傳遞的編譯器,但是當運行JNI的GetStaticMethodID方法,該平臺將引發錯誤象下面這樣:

java.lang.NoSuchMethodError: no static method with name='getInstance' 
    signature='(I)Lcom/example/hellojni/EventType;' 
    in class Lcom/example/hellojni/EventType; 

我不知道有什麼不同枚舉與其他類做什麼,你有什麼ID EA?

+0

'[LCOM /例子/ hellojni/EventType'似乎是一個_Array_ 'com.example.hellojni.EventType' ...或者僅僅是你的文章中的一個錯字? –

+0

不要試圖發明JNI方法簽名。使用'javap -s'的輸出。這絕不是錯的。 – EJP

+0

對不起,'['是編輯中的錯誤,因爲我在getIntsnace()方法後嘗試獲取values()方法。 – David

回答

2

您在JNI使用方法簽名是尋找一個看起來像這樣的方法:

public static EventType[] getInstance(int id) { 
} 

所以簽名的返回類型肯定是不對的。那裏不應該有[

現在你有兩個選擇要麼更改輸入類型int在Java端更改類型簽名(Ljava/lang/Integer;)Lcom/example/hellojni/EventType;

現在你會意識到,第二個選擇不容易處理,因爲要訪問Integer的值,你將不得不使用JNI方法和所有其他模糊。

您還應該重新思考爲什麼您要在您的Java代碼中使用Integer包裝而不是原始的int。它根本沒有理由。

重寫你的enum的東西是這樣的:

public enum EventType { 
    UPDATE(0), ADD(1), REMOVE(2), RESPONSE(3); 

    private int id; 

    public int id() { 
     return this.id(); 
    } 

    /** 
    * constructor method 
    */ 
    EventType(int id) { 
     this.id = id; 
    } 

    public static EventType getInstance(int id) { 
     switch (id) { 
      case 0: 
       return UPDATE; 
      case 1: 
       return ADD; 
      case 2: 
       return REMOVE; 
      case 3: 
       return RESPONSE; 
      default: 
       return null; 
     } 
    } 
} 

,並更改JNI方法查找到這一點:

jmethodID midInstance = (*env)->GetStaticMethodID(env,eventType_cls,"getInstance","(I)Lcom/example/hellojni/EventType;");