我有一个要求,其中我在本地C枚举++代码为[所有伪]:维护本地C++枚举和Java枚举同步
enum Dummy {
A,
B,
MAX,
};
现在我也希望有在Java代码的等效枚举
public static enum Dummy {
A,
B,
MAX
};
双重定义使得事情变得非常脆弱和容易出错,受到部分开发人员的失忆症或无聊感。有没有一些具体的方法来始终让它们同步。我不想要this问题所建议的一堆#defines
。
我有一个要求,其中我在本地C枚举++代码为[所有伪]:维护本地C++枚举和Java枚举同步
enum Dummy {
A,
B,
MAX,
};
现在我也希望有在Java代码的等效枚举
public static enum Dummy {
A,
B,
MAX
};
双重定义使得事情变得非常脆弱和容易出错,受到部分开发人员的失忆症或无聊感。有没有一些具体的方法来始终让它们同步。我不想要this问题所建议的一堆#defines
。
去硬,预处理程序,方式;)
/* main.cc */
#include <stdio.h>
#define public
#include "A.java"
;
#undef public
int main() {
A val = a;
if(val == a) {
printf("OK\n");
} else {
printf("Not OK\n");
}
}
Java代码
/* A.java */
public
enum A {
a,
b
}
我们可以用枚举在Java中
/* B.java */
public class B {
public static void main(String [] arg) {
A val = A.a;
if(val == A.a) {
System.out.println("OK");
} else {
System.out.println("Not OK");
}
}
}
和执行
> javac *.java
> java B
OK
> g++ -o main ./main.cc
> ./main
OK
你可以用一个构造函数创建你的enum
,这样你就可以为它分配你想要的值,然后使用一个JNI调用来获得该枚举的值。像这样在Java中的东西(请注意,我没有测试此代码在所有,但我已经写类似的代码在过去做的正是你所需要的):
public class TestEnum
{
public enum Dummy
{
A(getA());
B(getB());
MAX(getMax());
private final int value;
Dummy(int newValue)
{
this.value = newValue;
}
int getValue()
{
return(this.value);
}
private static native int getA();
private static native int getB();
private static native int getMAX();
}
...
}
在本机端:
enum Dummy
{
A = 100;
B = 102;
MAX = 912343;
};
...
JNIEXPORT jint JNICALL Java_TestEnum_00024TEST_getA(JNIEnv *env, jclass cls)
{
return(A);
}
JNIEXPORT jint JNICALL Java_TestEnum_00024TEST_getB(JNIEnv *env, jclass cls)
{
return(B);
}
JNIEXPORT jint JNICALL Java_TestEnum_00024TEST_getMAX(JNIEnv *env, jclass cls)
{
return(MAX);
}
请确保您使用javah
来生成您的本机功能签名,并在您的代码中生成标头#include
。
或者,您也可以通过别的东西来的本地函数来确定枚举值返回,如映射到实际枚举值的字符串:
public class TestEnum
{
public enum Dummy
{
A(get("A"));
B(get("B"));
MAX(get("MAX"));
private final int value;
Dummy(int newValue)
{
this.value = newValue;
}
int getValue()
{
return(this.value);
}
private static native int get(String enumName);
}
...
}
,并在本机端:
JNIEXPORT jint JNICALL Java_TestEnum_00024TEST_get(JNIEnv *env, jclass cls, jstring enumName)
{
char *cEnumName = (*env)->getStringUTFChars(env, enumName, NULL);
jint retVal = -1;
if (0 == strcmp(cEnumName, "A"))
{
retVal = A;
}
else if (0 == strcmp(cEnumName, "B"))
{
retVal = B;
}
else if (0 == strcmp(cEnumName, "MAX"))
{
retVal = MAX;
}
(*env)->ReleaseStringChars(env, cEnumName);
return(retVal);
}
您仍然需要处理一些开销,但这种方式实际值只能在一个地方定义。在这种情况下,它在本机代码中。
感谢您的全面回答,但我不确定这是否能够防止开发人员意外遗漏。如果他在本机代码中添加枚举值'x',但忘记在java代码中询问相应的'X(getX())'。虽然你的答案确实解决了多重定义部分。我在这里错过了什么吗? – Zoso
坚持...你是问我在C++代码中包含Java文件吗? cc扩展是否允许这样做?并且'#define public',那个公共是C++中的关键字的合法代码? – Zoso