通过jni将枚举本机类型暴露给java?

时间:2013-11-05 15:52:17

标签: java android c++ android-ndk java-native-interface

我有c ++类,其成员来自枚举类型。我想使用jni在java中公开此类中的对象。我已经成功地为班上的所有成员完成了它,但是我对枚举类型成员有问题。我已经用这种方式在java中定义了enum

 public enum Call {
    UNDEFINED(-1), INCOMING(1), OUTGOING(2), MISSED(4);
     private int type;
     private Call(int type) {
       this.type = type;
     }
     public int type() {
        return this.type; 
     }   
}

以这种方式在c ++中

enum Call {
    UNDEFINED = -1,
    INCOMING = 1,
    OUTGOING = 2,
    MISSED = 4
};

c ++中的原始类是

class LogData{
     int _id;
     Call _calltype;
     long _datetime;
     int _duration;
}

在java中

public class LogDataJava{
  int _id; 
  Call _callType;
  long _dateTime;
  int _duration;
}

有关如何在枚举类型的jni级别进行映射的任何建议吗?

1 个答案:

答案 0 :(得分:3)

枚举值基本上是枚举类中的静态字段。

因此,例如,您可以在jni代码中执行以下操作,将其映射到Java

LogData* l = /*...*/
jclass clCall = env->FindClass("LogDataJava$Call");
if (l->_callType == Call.UNDEFINED) {
    jfieldID fid = env->GetStaticFieldID(clCall , "UNDEFINED", "LLogDataJava$Call;"); 
} /* else ....*/

jobject callType = env->GetStaticObjectField(cl, fid);

您还可以找到有关静态字段here

的更多信息