2012-06-27 29 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