首先需要定义枚举类,此处以录音状态为例,未添加自定义属性和方法:
public enum RecordState {
Normal,
Error,
Recording,
Discard,
Export,
Complete
}
添加java方法供JNI调用,返回枚举对象:
public static RecordState getRecordState() {
// ...
return recordState;
}
在cpp中调用getRecordState()获取枚举对象,然后使用Enum.ordinal()获取枚举对象从0开始的index。
获取getRecordState()所在的java类:
jclass clazz = (*jniEnv).FindClass("com/xxxx/xxxx/CppCallJava");
获取getRecordState()的methodID并调用以获取枚举对象:
jmethodID stateMethodID = (*jniEnv).GetStaticMethodID(clazz, "getRecordState","()Lcom/xxxx/xxxx/RecordState;");
jobject stateJobj = jniEnv->CallStaticObjectMethod(clazz, stateMethodID);
通过ordinal()返回枚举值:
jclass stateClazz = (*jniEnv).FindClass("com/xxxx/xxxx/RecordState");
jmethodID stateMethod = (*jniEnv).GetMethodID(stateClazz, "ordinal", "()I");
jint state = (*jniEnv).CallIntMethod(stateJobj, stateMethod);
此处枚举类未添加其他方法,返回的jint既是默认的从0开始的有序数值。
若需在cpp读取该状态:
typedef enum {
Normal,
Error,
Recording,
Discard,
Export,
Complete
} RecorderState;
msg.state = RecorderState(state);