2012-06-27 23 views
14

en Java que tienen:cómo devolver enumeración de JNI

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 

} 

Quiero método nativo 'nativeGetStatus' devolver este valor de enumeración.

JNI devolver entero y comparar con el valor de enum en java es una opción, pero se preguntaba si es posible devolver el valor a través de jobject y asignarlo directamente al estado? Si es así, ¿cómo?

Respuesta

3

Por supuesto, puedes hacerlo. Los valores Enum son campos públicos estáticos de la clase Enum, por lo que puede usar el manual oficial this para escribir el código. Acaba de obtener el campo de JNI y devolverlo como jobject.

+0

¿Está señalando al campo de acceso 'estado' y lo devuelve como jobject? lo siento, me olvidé de mencionar en mi publicación original que podría haber más de un campo al que se le asignaría el valor de retorno de nativeGetStatus. En este caso, "Obtener el campo de JNI y devolverlo como jobject" podría no funcionar. – krt

+0

No, quiero decir que ONE es un campo estático de clase STATUS. Puede acceder a él y regresar de JNI. –

+33

[Esta es la razón por la que nunca debe proporcionar un enlace como respuesta] (http://25.media.tumblr.com/d10e5fba3bfbe874fbda2fcd8c2c2415/tumblr_mkvzqac3YX1r55vh6o1_1280.png). – namuol

-2

ENUM no es un tipo de datos primitivo en Java y es muy específico para Java. Hay un conjunto específico de tipos de datos java que se pueden asignar al código nativo. Compruebe this link para todos los tipos admitidos.

para su caso, es necesario envolver el método nativo en otro método que traducir los datos devueltos por el método nativo a una enumeración de Java.

+0

O haga la asignación en el método JNI. – EJP

+0

@EJP ¿pueden explicar un poco más? – Santosh

+0

@EJP declarar la enumeración nuevamente en JNI? – krt

35

Luché con la respuesta aceptada ya que no pude determinar la firma del campo estático por un tiempo. Así que aquí está la implementación de JNI que debería funcionar con el ejemplo anterior (no probado):

jclass clSTATUS = env->FindClass("MyClass$STATUS"); 
jfieldID fidONE = env->GetStaticFieldID(clSTATUS , "ONE", "LMyClass$STATUS;"); 
jobject STATUS_ONE = env->GetStaticObjectField(clSTATUS, fidONE); 

return STATUS_ONE; 
+0

Tengo una clase que tiene un Enum interno y este ejemplo me ayudó a especificar un objeto del tipo Enum con 'LClass $ InternalEnum;'. ¡Muchas gracias! – mpellegr

+0

¡Gracias! Esta respuesta me ayudó. Nota para quien no está muy familiarizado con Java y JNI como yo: debe especificar el paquete de clase dentro de su nombre tanto en FindClass como en GetStaticFieldID, por ejemplo "com/example/MyClass $ STATUS". – Vlad