0

私は以下のような列挙型を定義します:

public enum EventType {
    UPDATE(0), ADD(1), REMOVE(2), RESPONSE(3);

    private Integer id;

    public Integer id() {
        return this.id();
    }

    /**
     * constructor method
     */
    EventType(Integer id) {
        this.id = id;
    }

    public static EventType getInstance(Integer id) {
        switch (id) {
            case 0:
                return UPDATE;
            case 1:
                return ADD;
            case 2:
                return REMOVE;
            case 3:
                return RESPONSE;
            default:
                return null;
        }
    }
}

コールバック getInstance メソッドで enum インスタンスを作成したいのですが、JNI コードは次のようになります。

jclass eventType_cls = (*env)->FindClass(env,"com/example/hellojni/EventType");
jmethodID midInstance = (*env)->GetStaticMethodID(env,eventType_cls,"getInstance","(I)[Lcom/example/hellojni/EventType;");

コンパイラを通過しますが、JNI GetStaticMethodID メソッドを実行すると、プラットフォームは次のようなエラーをスローします。

java.lang.NoSuchMethodError: no static method with name='getInstance' 
    signature='(I)Lcom/example/hellojni/EventType;' 
    in class Lcom/example/hellojni/EventType;

enum が他のクラスと何が違うのかわからないのですが、何か分かりますか?

4

1 に答える 1

2

JNI でメソッドに使用する署名は、次のようなメソッドを探しています。

public static EventType[] getInstance(int id) {
}

したがって、署名の戻り値の型は間違いなく間違っています。そこにあるべきではありません[

intここで、Java 側で入力タイプを に変更する、タイプ シグネチャを に変更する 2 つの可能性があります(Ljava/lang/Integer;)Lcom/example/hellojni/EventType;

Integerの値にアクセスするには、 JNI メソッドと他のすべての fuzz を使用する必要があるため、2 番目の選択肢は扱いが簡単ではないことがわかります。

また、Java コードでIntegerプリミティブの代わりにラッパーを使用する理由を再考する必要があります。intそれには理由がありません。

enum次のように書き換えます。

public enum EventType {
    UPDATE(0), ADD(1), REMOVE(2), RESPONSE(3);

    private int id;

    public int id() {
        return this.id();
    }

    /**
     * constructor method
     */
    EventType(int id) {
        this.id = id;
    }

    public static EventType getInstance(int id) {
        switch (id) {
            case 0:
                return UPDATE;
            case 1:
                return ADD;
            case 2:
                return REMOVE;
            case 3:
                return RESPONSE;
            default:
                return null;
        }
    }
}

JNI メソッドのルックアップを次のように変更します。

jmethodID midInstance = (*env)->GetStaticMethodID(env,eventType_cls,"getInstance","(I)Lcom/example/hellojni/EventType;");
于 2013-06-27T04:41:14.053 に答える