6

JNI から Java enum フィールドを設定するにはどうすればよいですか? これがサンプルコードです。ネイティブ関数「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

これにより、enum クラスの valueOF methodID に加えて、別のアプローチが可能になります。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

列挙型の名前しかない場合にJavaから行うのと同じように:

  1. JNI 経由でクラス インスタンスをルックアップします。
  2. valueOf(String)enum クラスでメソッドを呼び出す
于 2013-11-05T16:05:59.533 に答える