JNI 中处理 JAVA enum

学习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);
}

posted @ 2011-07-21 01:06  为学  阅读(4213)  评论(0编辑  收藏  举报