JNI 使用java 枚举类

新创建的枚举类型继承自Enum类。
Enum类有两个成员变量,name和ordinal。name为枚举常量的名字,ordinal为枚举常量声明时的顺序(从0开始)。Enum类有一个ordinal()方法,用来获取变量ordinal的值;还有一个values()方法用来获取所有的枚举常量,返回值是一个枚举的数组。
JAVA的枚举类型构造函数一定是私有的,因为要保证枚举是单例的。因此我们不能在JNI里使用AllocObject、NewObject这种需要用到构造函数的方法构建一个枚举型。JAVA枚举类型的成员都是static的,JNI中可以直接访问

  • java enum
package mdw.appencrypt;

/**
 * 设备状态
 */
public enum DeviceState {
    /**
     * 设备不存在
     */
    DEVICE_ABSENT_STATE(0x00000000),
    /**
     * 设备存在
     */
    DEVICE_PRESENT_STATE(0x00000001),
    /**
     * 设备状态未知
     */
    DEVICE_UNKNOW_STATE(0x00000002);
    public int value;
    DeviceState(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }

    /**
     * 自定义了一个static方法,获取指定顺序的枚举
     */
    public static DeviceState getDeviceState(int code) {
        for (DeviceState e : DeviceState.values()) {
            if (e.getValue() == code) {
                return e;
            }
        }
        return null;
    }

}
  • JNI 调用
jobject generateDeviceState(JNIEnv* env, jint pulDevState){

    // FindClass查找Java中的类
    jclass myClass = env->FindClass("mdw/appencrypt/DeviceState");
    
    // 通过GetMethodID获取类的静态成员ID ,第一个参数是一个Java类;第二个参数是使用UTF-8编码的属性名;第三个参数是使用UTF-8编码的属性类型签名。
    // jmethodID id = env->GetMethodID(myClass, "ordinal", "()I");
    
    // 通过GetStaticMethodID获得一个静态方法ID。该方法与GetMethodID方法的参数都是一样的。
    jmethodID j_method_getDeviceState = env->GetStaticMethodID(myClass,"getDeviceState","(I)Lmdw/appencrypt/DeviceState;");
    
    // 通过CallStaticObjectMethod调用了一个我们自定义的静态方法,返回值是一个类的实例
    jobject jobjectDeviceState = env->CallStaticObjectMethod(myClass,j_method_getDeviceState,(int)pulDevState);

    //释放资源
    env->DeleteLocalRef(myClass);

    return jobjectDeviceState;
}

参考:https://blog.csdn.net/Zhou2828/article/details/89379470

你可能感兴趣的:(java,开发语言,c++)