Как вернуть enum из 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 

}

Я хочу, чтобы нативный метод nativeGetStatus возвращал это значение перечисления.

JNI, возвращающий целое число и сравнивающий со значением enum в java, является опцией, но было интересно, возможно ли вернуть значение через jobject и присвоить его непосредственно состоянию? если да как?

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам