Java 在JNI中打开枚举?

Java 在JNI中打开枚举?,java,enums,java-native-interface,switch-statement,Java,Enums,Java Native Interface,Switch Statement,鉴于: 以下代码的JNI等价物是什么 enum Foo { FIRST, SECOND } 我知道我可以使用JNI提供的foo.equals(foo.FIRST),但我希望获得与switch(enum)相同的性能。有什么想法吗?您所指的值实际上是枚举的序号 要实现值获取,只需将其作为私有字段存储在FooEnum中: Foo foo = ...; int value; switch (foo) { case FIRST: value = 1; break; cas

鉴于:

以下代码的JNI等价物是什么

enum Foo
{
  FIRST,
  SECOND
}

我知道我可以使用JNI提供的
foo.equals(foo.FIRST)
,但我希望获得与
switch(enum)
相同的性能。有什么想法吗?

您所指的
值实际上是
枚举的序号

要实现值获取,只需将其作为私有字段存储在FooEnum中:

Foo foo = ...;
int value;
switch (foo)
{
  case FIRST:
    value = 1;
    break;
  case SECOND:
    value = 2;
    break;
}
公共枚举{ 私有最终整数值; 私有FooEnum(int值){ 这个值=值; } public int getValue(){ 返回值; } 第一(1); }
通过这种方式,您可以根据
FooEnum
值进行切换。

如果您:

  • 在Java枚举类中提供一个整型值字段
  • 在C或C++中定义一组并行常数(例如,用另一枚举)。
冗余的定义带来了分歧的风险。您可以通过以下方式缓解此问题:

  • 大量记录两侧的平行度。如果枚举很小且不经常更改,则此方法效果最好
  • 从单个源生成代码
例如,在Java中,您可以有:

public enum FooEnum { private final int value; private FooEnum(int value) { this.value = value; } public int getValue() { return value; } FIRST(1); }
    public enum Foo {
            FIRST(0),
            SECOND(1);

            public int getValue() { return m_value; }

            private int m_value;
            private Foo( int value ) { m_value = value; }
    }

和C++中,可以有:

public enum FooEnum { private final int value; private FooEnum(int value) { this.value = value; } public int getValue() { return value; } FIRST(1); }
    public enum Foo {
            FIRST(0),
            SECOND(1);

            public int getValue() { return m_value; }

            private int m_value;
            private Foo( int value ) { m_value = value; }
    }

对于并行枚举,我个人总是在C/C++端显式地使用枚举值。否则,删除两侧的枚举数可能会导致值发散。

您可以在编译枚举后但在编译JNI代码之前运行一个流程步骤。它将加载枚举并将值输出到.h文件。然后,您的JNI代码包含这个.h文件

编辑:

这里有一些代码可以做到这一点。它需要修改以接受参数并写入文件,而不是System.out,但这很容易做到

    enum Foo {
          FIRST = 0,
          SECOND = 1
    };
URL u=新文件(“/home/adam/tmp”).tour();
URLClassLoader=新的URLClassLoader(新的URL[]{u},Test.class.getClassLoader());

ClassFooEnum为什么在上面声明为类而不是枚举?我错了,我用老式的方式写了它enum@EJP我试过了。你能给它一面旗子让它发挥作用吗?否则,它只会为本机方法创建原型。上次我这么做时,它就工作了。请查看您的.h和.c文件。