我一直在研究一个既支持CPP又支持Java的项目,我在cpp头文件中有一些枚举常量。是否可以通过任何更改在Java中使用JNI ??
使用这些头文件答案 0 :(得分:1)
您可以轻松地将C ++ enum
的整数值转换为Java。例如,C errno
值(技术上不是enum
,但我从一些我方便的代码中抓住了这个例子。)
爪哇:
public static final int EINVAL = getEINVAL();
private static final int getEINVAL();
原生代码:
JNIEXPORT jint JNICALL Java_some_class_getEINVAL( JNIEnv *env, jclass cls )
{
return( EINVAL );
}
请注意,您应始终使用javah
生成本机头文件,然后使用这些声明来定义本机函数。
随意用int
甚至Java Integer
替换Java enum
。我还没有尝试过这个特定的代码:
enum errno
{
EINVAL( getEINVAL() ),
ENOENT( getENOENT() ),
.
.
private int value;
errno( int value )
{
this.value = value;
}
}
但类似的东西应该很容易编码。
使用errno
值替换原始enum
值对于每个值都是微不足道的。当有许多enum
个常量传递给Java时,困难的部分就变成了如何维护Java和本机值之间的连接。我从来没有找到比仅仅硬编码方法更清晰的方法。它可能很乏味,但如果enum
值没有变化,那么它是可以管理的。如果原始enum
值发生了很大变化,您可能需要提出另一种方法,这样您就不会花费大量时间来替换源代码中的值。
答案 1 :(得分:0)
SWIG可能会有所帮助。它接受头文件或带注释的头文件,并为声明创建一个C JNI和Java包装器。
所以,如果你有
enum Values {
Value1,
Value2,
Value3
};
使用
%module ValuesClass
%include "Values.h"
你可以快速获得
public final class Values {
public final static Values Value1 = new Values("Value1");
public final static Values Value2 = new Values("Value2");
public final static Values Value3 = new Values("Value3");
public final int swigValue() {
return swigValue;
}
public String toString() {
return swigName;
}
public static Values swigToEnum(int swigValue) {
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
return swigValues[swigValue];
for (int i = 0; i < swigValues.length; i++)
if (swigValues[i].swigValue == swigValue)
return swigValues[i];
throw new IllegalArgumentException("No enum " + Values.class + " with value " + swigValue);
}
private Values(String swigName) {
this.swigName = swigName;
this.swigValue = swigNext++;
}
private Values(String swigName, int swigValue) {
this.swigName = swigName;
this.swigValue = swigValue;
swigNext = swigValue+1;
}
private Values(String swigName, Values swigEnum) {
this.swigName = swigName;
this.swigValue = swigEnum.swigValue;
swigNext = this.swigValue+1;
}
private static Values[] swigValues = { Value1, Value2, Value3 };
private static int swigNext = 0;
private final int swigValue;
private final String swigName;
}
在这个简单的例子中,Java代码就是您所需要的,因此它实际上并没有使用JNI。