【问题标题】:how to return enum from JNI如何从 JNI 返回枚举
【发布时间】:2012-06-27 11:34:26
【问题描述】:

在java中我有:

public class MyClass{

    public enum STATUS {
        ZERO,
        ONE ,
        TWO
    }

    public native STATUS nativeGetStatus();

    ...

    private STATUS state = nativeGetStatus(); //returns enum
    private STATUS state2 = nativeGetStatus(); //returns enum 

}

我希望本机方法“nativeGetStatus”返回此枚举值。

JNI 返回整数并与 java 中的枚举值进行比较是一种选择,但想知道是否可以通过 jobject 返回值并将其直接分配给 state ?如果是怎么办?

【问题讨论】:

  • 您可以将 JNI 作为 Int 值传递。请参阅this 示例。

标签: java enums java-native-interface


【解决方案1】:

我一直在努力接受已接受的答案,因为我有一段时间无法弄清楚静态字段的签名。所以这里的 JNI 实现应该适用于上面的例子(未测试):

jclass clSTATUS    = env->FindClass("MyClass$STATUS");
jfieldID fidONE    = env->GetStaticFieldID(clSTATUS , "ONE", "LMyClass$STATUS;");
jobject STATUS_ONE = env->GetStaticObjectField(clSTATUS, fidONE);

return STATUS_ONE;

【讨论】:

  • 我有一个具有内部枚举的类,这个示例帮助我使用“LClass$InternalEnum;”指定了一个枚举类型的对象。非常感谢!
  • 谢谢!这个答案帮助了我。请注意像我这样对 Java&JNI 不太熟悉的人:您必须在 FindClass 和 GetStaticFieldID 的名称中指定类包,例如“com/example/MyClass$STATUS”。
【解决方案2】:

当然,你可以做到。 Enum 值是 Enum 类的公共静态字段,可以使用this 官方手册编写代码。只需从 JNI 获取字段并将其作为作业返回即可。

【讨论】:

  • 您是否指向访问字段“状态”并将其作为作业返回?抱歉,我错过了在我的原始帖子中提到的可能有多个字段将被分配 nativeGetStatus 的返回值。在这种情况下,“只需从 JNI 获取字段并将其作为作业返回”可能不起作用
  • 不,我的意思是 ONE 是 STATUS 类的静态字段。您可以访问它并从 JNI 返回。
  • +l 用于很棒的不倒翁链接
猜你喜欢
  • 2016-02-21
  • 2020-08-10
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多