Подтвердить что ты не робот

Как вернуть перечисление от JNI

В java у меня есть:

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 и сравнение со значением enum в java является опцией, но было интересно, можно ли возвращать значение через jobject и назначать его непосредственно в состояние? если да, то как?

4b9b3361

Ответ 1

Конечно, вы можете это сделать. Значения Enum представляют собой общедоступные статические поля класса Enum, поэтому вы можете использовать это официальное руководство для написания кода. Просто получите поле из JNI и верните его в качестве задания.

Ответ 2

Я боролся с принятым ответом, так как не мог понять подписи статического поля какое-то время. Итак, здесь реализация 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;

Ответ 3

ENUM не является примитивным типом данных в java и его специфическим java. Существует определенный набор типов данных java, которые могут быть сопоставлены с собственным кодом. Проверьте эту ссылку для всех поддерживаемых типов.

Для вашего случая вам нужно обернуть собственный метод в другом методе, который преобразует данные, возвращенные из native-метода, в Java Enum.