如何从JNI中的类中提取枚举?

时间:2012-02-07 11:55:11

标签: java java-native-interface

我有一个传递给本地方法的类,如下所示

public enum Color{  
         eRED,
         eGREEN,
         eBLUE};

public class ConfigColor{   
         public ColorE color;   
         public int value;};

public native int HelloWord(ConfigColor ConfigColorcls);

ConfigColor clsConfigColor = new ConfigColor();
clsConfigColor .color = eGREEN;
clsConfigColor . value = 255;

HelloWord(clsConfigColor);

我可以使用GetIntField和GetObjectClass提取int value。但是如何提取ColorE color?请帮忙

3 个答案:

答案 0 :(得分:1)

要获取该值,您可以使用以下

public static Color getFromInt(int id) {
    for (Color candidate : Color.values()) {
        if (candidate.getAsInt() == id) {
            return candidate;
        }
    }
    throw new RuntimeException("no Color " + id);
}

答案 1 :(得分:1)

好吧,我认为你不会得到enum本身,因为JNI支持的类型没有说enum:

http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp9502

我认为这很正常,Java枚举非常适合Java。

您可以做的是将您的枚举实例作为对象,调用name()方法,并获得包含您的枚举类型的String(例如“eRED”),然后您可以使用它。如果通过JNI调用的类也是可以访问枚举的Java类,则可以执行以下操作:

ColorEnum colorEnumInstance = ColorEnum.valueOf("eGREEN");

答案 2 :(得分:1)

使用GetObjectClass获取类对象,然后在其上调用getName()。您将获得jstring,例如“eRED”。这是你的枚举,但它可能不是最有用的形式。

或者,考虑将整数与您的枚举相关联:

public enum Color {
    eRED(0),
    eGREEN(1),
    eBLUE(2);

    private Color(int numer) {
        this.number = number;
    }
    public final int number; // Maybe a byte would suffice...
}

这类似于C枚举,它实际上只是(命名)整数。然后,您可以直接在C中访问枚举的number字段,而不是解析字符串。