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