gpt4 book ai didi

enums - 保持 native C++ 枚举和 Java 枚举同步

转载 作者:行者123 更新时间:2023-12-02 04:34:01 26 4
gpt4 key购买 nike

我有一个要求,其中我在 native C++ 代码中有一个枚举作为 [所有伪代码]:

enum Dummy {
A,
B,
MAX,
};

现在我也想在 Java 代码中有一个等效的枚举

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

双重定义使事情变得极其脆弱和容易出错,部分开发人员容易失忆或懒惰。有没有一些具体的方法可以让它们始终保持同步。我不想要 this 建议的一堆 #defines问题。

最佳答案

您可以使用构造函数创建您的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 生成您的 native 函数签名,并在您的代码中使用 #include 生成的 header 。

或者,您可以将其他内容传递给 native 函数以标识要返回的枚举值,例如映射到实际枚举值的字符串:

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 );
}

您仍然需要处理一些 O&M 开销,但这样实际值只在一个地方定义。在本例中,它位于 native 代码中。

关于enums - 保持 native C++ 枚举和 Java 枚举同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com