gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:35 26 4
gpt4 key购买 nike

我定义了一个如下的枚举:

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;

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

最佳答案

您在 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;");

关于java - 为什么 JNI 在枚举中找不到自定义静态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17333530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com