在java中使用CPP枚举常量

时间:2018-01-30 17:57:49

标签: java c++ java-native-interface

我一直在研究一个既支持CPP又支持Java的项目,我在cpp头文件中有一些枚举常量。是否可以通过任何更改在Java中使用JNI ??

使用这些头文件

2 个答案:

答案 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。