为什么JNI在枚举中找不到自定义静态?

时间:2013-06-27 02:20:48

标签: java c static enums java-native-interface

我定义了如下的枚举:

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;

我不知道与其他班级有什么不同的词汇,你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

因此签名的返回类型肯定是错误的。它不应该有[

现在您有两种可能性:将输入类型更改为Java端的int 将类型签名更改为(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;");