閱讀275 返回首頁    go 技術社區[雲棲]


JNI 中處理 JAVA enum

原文https://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);
}

最後更新:2017-04-02 06:51:58

  上一篇:go menu.addIntentOptions 添加動態菜單
  下一篇:go Ubuntu下打開和關閉筆記本觸摸板的方法