Как извлечь перечисление из класса в JNI? - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть класс, который передает нативный метод, как показано здесь

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);

Я могу извлечь int value, используя GetIntField и GetObjectClass.Но как извлечь ColorE color?Пожалуйста, помогите

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Ну, я не думаю, что вы получите enum per se, поскольку поддерживаемые JNI типы ничего не говорят о enum:

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

Это нормальноЯ предполагаю, что перечисление Java довольно специфично для Java.

Что вы можете сделать, это получить свой экземпляр перечисления как объект, вызвать метод name (), и вы получите строку, содержащую ваш тип перечисления (например, "eRED "), тогда вы можете использовать это.Если класс, который вы вызываете через JNI, также является Java-классом, который имеет доступ к enum, вы можете сделать:

ColorEnum colorEnumInstance = ColorEnum.valueOf("eGREEN");
1 голос
/ 07 февраля 2012

Используйте 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-перечислений, которые на самом деле являются просто (именованными) целыми числами. Тогда вы можете получить доступ к полю enum number непосредственно в C, вместо разбора строк.

1 голос
/ 07 февраля 2012

Чтобы получить значение, вы можете использовать следующее

public static Color getFromInt(int id) {
    for (Color candidate : Color.values()) {
        if (candidate.getAsInt() == id) {
            return candidate;
        }
    }
    throw new RuntimeException("no Color " + id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...