2017-08-01 38 views
2

我有一个要求,其中我在本地C枚举++代码为[所有伪]:维护本地C++枚举和Java枚举同步

enum Dummy { 
A, 
B, 
MAX, 
}; 

现在我也希望有在Java代码的等效枚举

public static enum Dummy { 
A, 
B, 
MAX 
}; 

双重定义使得事情变得非常脆弱和容易出错,受到部分开发人员的失忆症或无聊感。有没有一些具体的方法来始终让它们同步。我不想要this问题所建议的一堆#defines

回答

0

去硬,预处理程序,方式;)

/* 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 
+1

坚持...你是问我在C++代码中包含Java文件吗? cc扩展是否允许这样做?并且'#define public',那个公共是C++中的关键字的合法代码? – Zoso

0

你可以用一个构造函数创建你的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); 
} 

您仍然需要处理一些开销,但这种方式实际值只能在一个地方定义。在这种情况下,它在本机代码中。

+1

感谢您的全面回答,但我不确定这是否能够防止开发人员意外遗漏。如果他在本机代码中添加枚举值'x',但忘记在java代码中询问相应的'X(getX())'。虽然你的答案确实解决了多重定义部分。我在这里错过了什么吗? – Zoso