2012-06-27 59 views
14

返回枚舉在java中我有:如何從JNI

public class MyClass{ 

    public enum STATUS { 
     ZERO, 
     ONE , 
     TWO 
    } 

    public native STATUS nativeGetStatus(); 

    ... 

    private STATUS state = nativeGetStatus(); //returns enum 
    private STATUS state2 = nativeGetStatus(); //returns enum 

} 

我想native方法「nativeGetStatus」返回此枚舉值。

JNI返回整數並與java中的枚舉值比較是一個選項,但想知道是否可以通過jobject返回值並將其直接賦值給狀態?如果是的話如何?

回答

3

當然,你可以做到這一點。枚舉值是Enum類的公共靜態字段,因此您可以使用this官方手冊編寫代碼。只需從JNI獲得該字段並將其作爲工作項目返回即可。

+0

你指着訪問現場「國家」,並返回它作爲jobject?對不起,我錯過了在我原來的帖子中提到可能有多個字段會被賦予返回值nativeGetStatus。在這種情況下,「只需從JNI獲取字段並將其作爲工作項返回」可能不起作用 – krt

+0

不,我的意思是ONE是類STATUS的靜態字段。您可以訪問它並從JNI返回。 –

+33

[這就是爲什麼你永遠不應該提供一個鏈接作爲答案](http://25.media.tumblr.com/d10e5fba3bfbe874fbda2fcd8c2c2415/tumblr_mkvzqac3YX1r55vh6o1_1280.png)。 – namuol

-2

ENUM不是java中的原始數據類型,它非常適合java。有一個特定的一組java數據類型可以映射到本地代碼。所有支持的類型請檢查this link

對於你的情況,你需要包裹本地方法其中將轉化從本地方法返回一個Java枚舉數據的另一種方法。

+0

或者在JNI方法中進行映射。 – EJP

+0

@EJP你能詳細說一下嗎? – Santosh

+0

@EJP在JNI中再次聲明枚舉? – krt

35

我在接受的答案中掙扎,因爲我無法弄清靜態字段的簽名了一段時間。因此,這裏的應該與工作例以上(未測試)的JNI實現:

jclass clSTATUS = env->FindClass("MyClass$STATUS"); 
jfieldID fidONE = env->GetStaticFieldID(clSTATUS , "ONE", "LMyClass$STATUS;"); 
jobject STATUS_ONE = env->GetStaticObjectField(clSTATUS, fidONE); 

return STATUS_ONE; 
+0

我有一個有內部枚舉的類,這個例子幫助我用'LClass $ InternalEnum;'指定Enum類型的一個對象。非常感謝! – mpellegr

+0

謝謝!這個答案幫了我。注意誰不像我這樣熟悉Java和JNI:您必須在FindClass和GetStaticFieldID中指定類名稱,例如「com/example/MyClass $ STATUS」。 – Vlad