JNI 中处理 JAVA enum

原文:http://www.cnblogs.com/crazywolf/archive/2011/07/21/2112276.html

学习JAVA已经有段时间,其中非常重要的一环是将原有的C代码用JNI的方式让JAVA去调用。今天解决了一个对enum类型处理的问题。

原理很简单,enum 其实也是一个类,那这个类有什么特色呢?

例如我定义了一个类:

 1  public   class  SerialPort {
 2       public   enum  Parity {
 3          None( 0 ),
 4          Odd( 1 ),
 5          Even( 2 ),
 6          Mark( 3 ),
 7          Space( 4 );
 8           private   int  value;
 9           private  Parity( int  value) {
10               this .value  =  value;
11          }
12           public   int  value() {
13               return   this .value;
14          }
15      }
16 
17       public   native   boolean  setParity(Parity parity);
18       public   native  Parity getParity();
19  }

 那么使用 javap -s SerialPort.Parity 可得到:

 Compiled from "SerialPort.java"

public final class SerialPort$Parity extends java.lang.Enum {

public static final SerialPort$Parity None;

  Signature: LSerialPort$Parity; 

 

public static final SerialPort$Parity Odd;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Even;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Mark;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Space;

  Signature: LSerialPort$Parity;
 static {};

 

  Signature: ()V

public int value();

 Signature: ()I

public static SerialPort$Parity[] values();

  Signatue: ()[LSerialPort$Parity;

public static SerialPort$Parity valueOf(java.lang.String);

  Signature: (Ljava/lang/String;)LSerialPort$Parity;

}

看到这里的信息就明朗了,Enum类就是包含多个定义的Enum类本身的静态常量,加上一些自定义的方法。那想要操作它就像操作一般的类一样了。在C代码里可以这样操作即可达到使用Enum类。

jboolean Java_SerialPort_setParity(JNIEnv  * env, jobject obj, jobject parity) {
    jclass clsParity 
=  ( * env) -> GetObjectClass(env, parity);
    jmethodID idValue 
=  ( * env) -> GetMethodID(env, clsParity,  " value " " ()I " );
    gint32 value 
=  ( * env) -> CallIntMethod(env, parity, idValue);
    
if  (serial_port_set_parity(get_port_address(env, obj), (XDSerialPortParity)value))
        
return  JNI_TRUE;
    
return  JNI_FALSE;
}

jobject Java_SerialPort_getParity(JNIEnv 
* env, jobject obj) {
    jclass clrParity 
=  ( * env) -> FindClass(env,  " SerialPort$Parity " );
    jfieldID id 
=  NULL;
    
switch  (serial_port_get_parity(get_port_address(env, obj))) {
    
case  SERIAL_PORT_PARITY_NONE:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " None " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_ODD:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Odd " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_EVEN:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Even " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_MARK:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Mark " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_SPACE:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Space " " LSerialPort$Parity; " );
        
break ;
    }
    
return  ( * env) -> GetStaticObjectField(env, clrParity, id);
}

你可能感兴趣的:(JNI 中处理 JAVA enum)