我定义了如下的枚举:
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;
我不知道与其他班级有什么不同的词汇,你有什么想法吗?
答案 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;");