在 JNI 中启用枚举?
给定:
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)
相同的性能。有什么想法吗?
Given:
enum Foo
{
FIRST,
SECOND
}
What is the JNI equivalent for the following code?
Foo foo = ...;
int value;
switch (foo)
{
case FIRST:
value = 1;
break;
case SECOND:
value = 2;
break;
}
I know I can use foo.equals(Foo.FIRST)
from JNI, but I'd like to get the same performance as switch(enum)
. Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以有一个进程步骤在编译枚举之后但在编译 JNI 代码之前运行。它将加载枚举并将值输出到 .h 文件。然后,您的 JNI 代码将包含此 .h 文件。
编辑:
下面是执行此操作的一些代码。需要对其进行修改以接受参数并写入文件而不是 System.out,但这很容易做到。
You could have a process step that runs after the enum is compiled but before the JNI code is compiled. It would load the enum and output the values to a .h file. Your JNI code then includes this .h file.
Edit:
Here's some code that does this. It needs to be modified to accept arguments and to write to a file instead of System.out, but that's easy enough to do.
如果满足以下条件,您也可以在 JNI 代码中使用 switch 语句:
冗余的定义带来了分歧的风险。您可以通过以下方式缓解这种情况:
例如,在 Java 中,您可以:
在 C++ 中,您可以:
对于并行枚举,我个人总是在 C/C++ 端显式地显示枚举值。否则,删除两侧的枚举数可能会导致值出现分歧。
You can use a switch statement in your JNI code as well, if you:
The redundant definition introduces a risk of divergence. You can mitigate this by:
For example, in Java, you could have:
And in C++, you could have:
For a parallel enumeration, I personally always make the enum values explicit on the C/C++ side. Otherwise, a deletion of an enumerator on both sides can cause the values to diverge.
您所指的
value
实际上是enum
的序数要实现值获取,只需将其存储为 FooEnum 中的私有字段:
这样您就可以可以根据您的 FooEnum 值进行切换。
What you're referring as
value
is actually the ordinal of theenum
To achieve value fetching, simple store it as a private field in you FooEnum:
This way you can switch based on your
FooEnum
value.