java jni enum_JNI 中处理 JAVA enum

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

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

例如我定义了一个类:

1 publicclassSerialPort {2 publicenumParity {3 None(0),4 Odd(1),5 Even(2),6 Mark(3),7 Space(4);8 privateintvalue;9 privateParity(intvalue) {10 this.value=value;11 }12 publicintvalue() {13 returnthis.value;14 }15 }16 17 publicnativebooleansetParity(Parity parity);18 publicnativeParity 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))returnJNI_TRUE;returnJNI_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))) {caseSERIAL_PORT_PARITY_NONE:

id=(*env)->GetStaticFieldID(env, clrParity,"None","LSerialPort$Parity;");break;caseSERIAL_PORT_PARITY_ODD:

id=(*env)->GetStaticFieldID(env, clrParity,"Odd","LSerialPort$Parity;");break;caseSERIAL_PORT_PARITY_EVEN:

id=(*env)->GetStaticFieldID(env, clrParity,"Even","LSerialPort$Parity;");break;caseSERIAL_PORT_PARITY_MARK:

id=(*env)->GetStaticFieldID(env, clrParity,"Mark","LSerialPort$Parity;");break;caseSERIAL_PORT_PARITY_SPACE:

id=(*env)->GetStaticFieldID(env, clrParity,"Space","LSerialPort$Parity;");break;

}return(*env)->GetStaticObjectField(env, clrParity, id);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值