3 Stimmen

Wie extrahiert man ein Enum aus einer Klasse in JNI?

Ich habe eine Klasse, die einer nativen Methode übergeben wird, wie hier gezeigt

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

Ich kann die int value mit GetIntField und GetObjectClass. Aber wie extrahiert man die ColorE color ? Bitte um Hilfe

1voto

Sankalp Punkte 1930

Um den Wert zu ermitteln, können Sie Folgendes verwenden

public static Color getFromInt(int id) {
    for (Color candidate : Color.values()) {
        if (candidate.getAsInt() == id) {
            return candidate;
        }
    }
    throw new RuntimeException("no Color " + id);
}

1voto

Shivan Dragon Punkte 14756

Nun, ich glaube nicht, dass Sie die enum per-se erhalten, da die JNI unterstützten Typen nichts über enum sagen:

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

Das ist ziemlich normal, denke ich, die Java-Enum ist ziemlich spezifisch für Java.

Sie können Ihre Enum-Instanz als Objekt erhalten, die name()-Methode aufrufen und den String erhalten, der Ihren Enum-Typ enthält (z. B. "eRED"), den Sie dann verwenden können. Wenn die Klasse, die Sie über JNI aufrufen, auch eine Java-Klasse ist, die Zugriff auf die Enum hat, können Sie das tun:

ColorEnum colorEnumInstance = ColorEnum.valueOf("eGREEN");

1voto

Joonas Pulakka Punkte 35583

Utilice GetObjectClass um das Klassenobjekt zu erhalten, und rufen Sie dann getName() dazu. Sie erhalten eine jstring zum Beispiel "eRED". Das ist Ihr Enum, aber es ist vielleicht nicht die nützlichste Form.

Alternativ können Sie auch eine ganze Zahl mit Ihrer Aufzählung wie folgt verknüpfen:

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...
}

Dies ist analog zu C enums, die eigentlich nur (benannte) Ganzzahlen sind. Dann könnten Sie auf die Enum's zugreifen number Feld direkt in C, anstatt Strings zu parsen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X