6

如何从 JNI设置Java 枚举字段?这是示例代码。我想在本机函数“get_state”中设置我的 B 对象的“myState”字段。

public class A {

    public enum STATE { 
        STATE_ONE,
        STATE_TWO
    }

    public static class B {
        public STATE myState;
    }

    public native void get_state(B b);

    public B getB() {
        B b;

        // Call JNI to get the state
        get_state(b);

        return b;
    }
}


JNIEXPORT void JNICALL Java_A_get_1state(JNIEnv *env, jobject object, jobject b_object)
{
    /* Get a reference to obj's class */
    jclass cls = (*env)->GetObjectClass(env, b_object);

    //How do I set B object's "myState" field?

}
4

3 回答 3

5

由于它是一个嵌套枚举类,因此 STATE 是隐式静态的。有许多资源,但可以在此处找到确切说明这一点的 Google 搜索:http ://www.javapractices.com/topic/TopicAction.do?Id=1

这允许在枚举类的 valueOF 方法 ID 之上使用另一种方法。您可以使用 env->GetStaticField 和 env->GetStaticObjectField 来获取要设置的枚举。

前任:

jclass theStateClass = env->FindClass("your/containingPackage/A$STATE");
jfieldID stateOneField    = env->GetStaticFieldID(theStateClass, "STATE_ONE", "Lyour/containingPackage/A$STATE;");
jobject STATE_ONE = env->GetStaticObjectField(theStateClass, stateOneField);
于 2014-03-13T21:12:16.297 回答
0

在构建这个类之前,我做了一些小的修改。

public class A {

    public enum STATE { 
        STATE_ONE,
        STATE_TWO
    }

    

    public native void get_state(B b);

    public B getB() {
        B b = new B();

        // Call JNI to get the state
        get_state(b);

        return b;
    }
    
    public static class B {
        public STATE myState = STATE.STATE_ONE;
        
    }
}

所以我们开始吧。第一步是构建java类

javac A.java

所以我们得到了一个 A.class 文件。

第二,生成签名。

javap -v A

外壳打印以下内容:

C:\Users\bowman\Desktop\project>javap -v -p -c A
Classfile /C:/Users/bowman/Desktop/project/A.class
  Last modified 2014-1-3; size 377 bytes
  MD5 checksum f331eddf740b0d8c256c851f04369088
  Compiled from "A.java"
public class A
  SourceFile: "A.java"
  InnerClasses:
       public static #7= #2 of #5; //B=class A$B of class A
       public static final #10= #9 of #5; //STATE=class A$STATE of class A
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#21         //  java/lang/Object."<init>":()V
   #2 = Class              #22            //  A$B
   #3 = Methodref          #2.#21         //  A$B."<init>":()V
   #4 = Methodref          #5.#23         //  A.get_state:(LA$B;)V
   #5 = Class              #24            //  A
   #6 = Class              #25            //  java/lang/Object
   #7 = Utf8               B
   #8 = Utf8               InnerClasses
   #9 = Class              #26            //  A$STATE
  #10 = Utf8               STATE
  #11 = Utf8               <init>
etc...

要点是:

公开课A

源文件:“A.java”

内部类:

公共静态 #7= #2 的 #5; //B=A 类的 A$B 类

公共静态最终 #10= #9 of #5; //STATE=class A$STATE 类 A

所以我们可以推断枚举是一个具有“A$STATE”签名的类

您可以通过以下方式在 cpp 中获取此类:

jclass A_State = env->FindClass( "LA$STATE;");

希望能帮助到你。

于 2014-01-02T17:50:50.807 回答
0

就像您只有枚举名称时从 Java 中执行此操作一样:

  1. 通过 JNI 查找类实例。
  2. 调用valueOf(String)枚举类的方法
于 2013-11-05T16:05:59.533 回答