我有一个类和一个枚举,就像这样:
public class ppmerrJNI
{
public enum ppm_err_e {
ONE(0),
TWO(1),
THREE(2);
private int code;
private ppm_err_e(int code) {
this.code = code;
}
public int getValue() {
return code;
}
ppm_err_e getObj(int i) {
return ppm_err_e.values()[i];
}
};
...
}
我有JNI包装函数声明如下:
JNIEXPORT jobject JNICALL Java_ppmerrJNI_ppm_1get_1last_1error(JNIEnv *env, jobject thisObj) {
int someNumber = 5;
jclass employeeClass = (*env)->FindClass(env,"ppmerrJNI$ppm_err_e");
jmethodID midConstructor = (*env)->GetMethodID(env, employeeClass, "<init>", "(I)V");
jobject employeeObject = (*env)->NewObject(env, employeeClass, midConstructor, someNumber);
return employeeObject ;
}
在第二行(GetMethodId),我得到:&#34;线程中的异常&#34; main&#34; java.lang.NoSuchMethodError:&#34;。
基本上,我想调用枚举类型的构造函数&#34; ppm_err_e&#34;,它位于类&#34; ppmerrJNI&#34;内。我想根据someNumber数字返回一个枚举对象,这是我采取的方法;也可以解决任何其他可能的解决方案。
我也尝试过:
jmethodID constructor = (*env)->GetMethodID(env, enumClass, "getObj", "(I)LppmerrJNI$ppm_err_e;");
但它总是返回null。
提前谢谢!
答案 0 :(得分:2)
您无法实例化枚举。这就是为什么我不能调用JNI的NewObject()
方法(枚举只允许私有构造函数,因此实例化不可能 - 你需要公共构造函数)的原因。我通过在外部类中创建一个方法来解决它,该方法将枚举索引作为参数并返回相应的枚举实例。该方法在JNI中通过CallObjectMethod()
而不是NewObject()
调用。
答案 1 :(得分:1)
尝试以下内容。您应该访问静态字段,而不是构造枚举。
JNIEXPORT jobject JNICALL Java_ppmerrJNI_ppm_1get_1last_1error(JNIEnv *env, jobject thisObj) {
int someNumber = 5;
jclass employeeClass = (*env)->FindClass(env, "ppmerrJNI");
jfieldID oneField = (*env)->GetStaticFieldID(env, employeeClass , "ONE", "ppmerrJNI$ppm_err_e;");
jobject STATE_ONE = (*env)->GetStaticObjectField(env, employeeClass, oneField);
return employeeObject ;
}