275
技術社區[雲棲]
JNI 中處理 JAVA enum
原文:https://www.cnblogs.com/crazywolf/archive/2011/07/21/2112276.html
學習JAVA已經有段時間,其中非常重要的一環是將原有的C代碼用JNI的方式讓JAVA去調用。今天解決了一個對enum類型處理的問題。
原理很簡單,enum 其實也是一個類,那這個類有什麼特色呢?
例如我定義了一個類:
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;
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類。
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