Gil*_*ili 5 java java-native-interface enums switch-statement
鉴于:
enum Foo
{
FIRST,
SECOND
}
Run Code Online (Sandbox Code Playgroud)
以下代码的JNI等价物是什么?
Foo foo = ...;
int value;
switch (foo)
{
case FIRST:
value = 1;
break;
case SECOND:
value = 2;
break;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用foo.equals(Foo.FIRST)JNI,但我希望获得相同的性能switch(enum).有任何想法吗?
您可以有一个进程步骤在编译枚举之后但在编译 JNI 代码之前运行。它将加载枚举并将值输出到 .h 文件。然后,您的 JNI 代码将包含此 .h 文件。
编辑:
这是执行此操作的一些代码。需要对其进行修改以接受参数并写入文件而不是 System.out,但这很容易做到。
URL u = new File("/home/adam/tmp").toURL();
URLClassLoader loader = new URLClassLoader(new URL[] {u}, Test.class.getClassLoader());
Class<? extends Enum> c = (Class<? extends Enum>) loader.loadClass("Color");
PrintStream out = System.out;
out.println("#ifndef COLOR_H");
out.println("#define COLOR_H");
for(Enum constant : c.getEnumConstants()) {
out.println("#define " + c.getCanonicalName().replaceAll("\\.", "_") + "_" + constant.name() + " " + constant.ordinal());
}
out.println("#endif");
Run Code Online (Sandbox Code Playgroud)