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

时间:2012-11-20 21:29:27

标签: android-ndk java-native-interface

我正在将端口的现有项目中的标头导入Android-NDK。在少数情况下,我希望在Java层中使用本机头文件中定义的枚举。怎么可以这样做呢?

理想情况下,我想以某种方式将常量暴露给Java层,但我没有看到这样做的方法。

最明显的可能性是在Java和C ++中双重定义枚举。但是,现有标题a)没有明确的编号,b)具有#ifdef'ed的元素,而c)通过SVN Externals与现有项目共享。因此,双重定义枚举似乎比典型情况更加脆弱。

下一个想法是使用一些构建时代码生成基于预处理标头在Java中创建枚举 - 可能只是整数常量而不是Java枚举?

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

建议?

1 个答案:

答案 0 :(得分:1)

我会创建一个完全独立的Java枚举集,并在JNI级别和它们都可用的映射之间进行映射。确保在枚举类上运行javah,以便为它们的序数获得一些#defines。