【发布时间】:2014-08-11 16:20:47
【问题描述】:
我有一个类和一个枚举,如下所示:
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) 我得到:“线程中的异常”main“java.lang.NoSuchMethodError:”。
基本上,我想调用枚举类型“ppm_err_e”的构造函数,它位于类“ppmerrJNI”中。我想根据 someNumber 返回一个枚举对象,这是我采用的方法;也可以满足于任何其他可能的解决方案。
我也试过:
jmethodID constructor = (*env)->GetMethodID(env, enumClass, "getObj", "(I)LppmerrJNI$ppm_err_e;");
但它总是返回 null。
提前谢谢你!
【问题讨论】:
-
您是否确认这些名称是您班级的实际名称?
"ppmerrJNI$ppm_err_e"?你不检查FindClass是否成功。 -
确保
employeeClass不是NULL。 -
是的,我已经检查过了,它不为空。
-
会不会因为枚举有私有构造函数而不能调用枚举的构造函数?
标签: java c++ enums java-native-interface wrapper