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