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方法创建一个枚举实例,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;

我不知道枚举与其他类有什么不同,你知道吗?

4

1 回答 1

2

您在 JNI 中为该方法使用的签名正在寻找如下所示的方法:

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

所以签名的返回类型肯定是错误的。它不应该在[那里。

现在您有两种可能性,要么int在 Java 端将输入类型更改为,要么将类型签名更改为(Ljava/lang/Integer;)Lcom/example/hellojni/EventType;.

现在您将意识到第二种选择不是很容易处理,因为要访问 的值,Integer您必须使用 JNI 方法和所有其他模糊方法。

您还应该重新考虑为什么要在 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 回答