从JNI

时间:2018-08-07 15:04:36

标签: java java-native-interface

我在尝试做的事情时遇到了各种各样的答案,但是没有什么完全一样的,任何帮助表示赞赏...

我有一个包范围的Java枚举,我想将它作为辩解传递给java方法,但找不到直接从JNI创建它的方法。这可能吗?

下面是代码的骨架:

MyEnum.java

package com.a.b;
public enum MyEnum {
   VALUE1,
   VALUE2,
   VALUE3
}

MyClass.java

package com.a.b.c;
import com.a.b.MyEnum;
public class MyClass {
  public MyClass(MyEnum value) { ... }
}

是否可以直接从JNI调用MyClass构造函数? (如果我删除枚举,则调用构造函数没有问题,即传递一个String并让Java代码进行转换,但无法解决该问题)。

1 个答案:

答案 0 :(得分:1)

这很简单。每个枚举值都是MyEnum类型的静态字段:

jclass myenum_clazz = env->FindClass("com/a/b/MyEnum");
jfieldID value2_fid = env->GetStaticFieldID(myenum_clazz, "VALUE2", "Lcom/a/b/MyEnum;");
jobject value2 = env->GetStaticObjectField(myenum_clazz, value2_fid);
...
jobject myclass = env->NewObject(myclass_clazz, myclass_init, value2);