作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要求,其中我在 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/
我是一名优秀的程序员,十分优秀!