Как вернуть перечисление от 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 и назначать его непосредственно в состояние? если да, то как?
Ответы
Ответ 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.