Java 在JNI中打开枚举?
鉴于: 以下代码的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
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文件。