Android ndk 如何通过JNI向Java公开本机枚举?

Android ndk 如何通过JNI向Java公开本机枚举?,android-ndk,java-native-interface,Android Ndk,Java Native Interface,我正在将一个端口的现有项目的标题导入Android NDK。在少数情况下,我希望从Java层使用本机头中定义的枚举。一个人怎么能这样做呢 理想情况下,我只想以某种方式将常量公开给Java层,但我看不到这样做的方法 最明显的可能性是在java和C++中对EnNs进行双重定义。但是,现有的标题a)没有明确的编号,b)有“如果定义”的元素,c)通过SVN外部与现有项目共享。因此,双重定义枚举似乎比典型情况更脆弱 下一个想法是使用一些构建时代码gen,基于预处理的头文件在Java中创建枚举——可能只是作

我正在将一个端口的现有项目的标题导入Android NDK。在少数情况下,我希望从Java层使用本机头中定义的枚举。一个人怎么能这样做呢

理想情况下,我只想以某种方式将常量公开给Java层,但我看不到这样做的方法

<>最明显的可能性是在java和C++中对EnNs进行双重定义。但是,现有的标题a)没有明确的编号,b)有“如果定义”的元素,c)通过SVN外部与现有项目共享。因此,双重定义枚举似乎比典型情况更脆弱

下一个想法是使用一些构建时代码gen,基于预处理的头文件在Java中创建枚举——可能只是作为整数常量而不是Java枚举

第三个也是最模糊的想法是在Java中定义枚举,将这些对象传递给JNI胶水,并将其与FindClass()、GetStaticFieldID()和GetStaticObjectField()的某些调用进行比较;然后让JNI胶水将它们重新映射到本机枚举。不过,这一切似乎都很低效


建议?

我将创建一组完全独立的Java枚举,并在JNI级别映射它们,在JNI级别您可以同时使用它们。确保在enum类上运行javah,以便为它们的序数得到一些#定义。

还有一个堆栈交换礼仪问题:如果我有一个问题和一些已知的可能答案(但希望有更好的答案),比如这一个,是否更愿意将我的潜在答案分成多个实际的“答案”用于投票/讨论?或者这仅仅是一种令人震惊的重复农业吗?其他人似乎都在做你上面所做的事情。关于堆栈溢出本身的问题属于。对于后来遇到这个问题的人,有一些提示:1)要在com.example.Foo类上运行javah,你应该已经构建了class/com/example/Foo.class,然后运行:
javah-classpath path/to/classes com.example.Foo
2)AFAICT,javah不会为指定类中的Java枚举创建任何内容。相反,声明一组
public static final int MY_ENUM_ITEM_a=1
等。这些将转换为
形式的#定义#com#示例(u Foo)u MY_ENUM_ITEM_a 1L
@benkc
javah
应为ENUM类的序号创建#定义。您可能需要直接将它们的全名指定到
javah
。我确实这样做了,所以它确实有效。@EJP这是你在另一个论坛上对这一声明的更正吗?如果是这样,javah不会为枚举的序数创建#定义,只为公共静态final int创建。