java - 在 JNI 中打开枚举?

标签 java enums java-native-interface switch-statement

给定:

enum Foo
{
  FIRST,
  SECOND
}

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

Foo foo = ...;
int value;
switch (foo)
{
  case FIRST:
    value = 1;
    break;
  case SECOND:
    value = 2;
    break;
}

我知道我可以使用 JNI 的 foo.equals(Foo.FIRST),但我想获得与 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");

关于java - 在 JNI 中打开枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4007307/

相关文章:

java - 计算多项分布的卷积

来自数组元素的 java math.sqrt

swift - 你能扩展一个枚举吗?

android - 在 Android Studio 中使用预建库

java - 我如何知道对象来自哪里,session缓存还是sessionFactory缓存

java - 如何查看其他类的方法

c# - 任何人都知道一种快速获取枚举值自定义属性的方法吗?

java - 如何按类将字符串值转换为枚举值?

c++ - 如何将 jint 插入到 jobjectArray 中?

java - 使用 MINGW 构建 JNI DLL