繁体   English   中英

在JNI中创建对象

[英]Object creation in JNI

我有一个类和一个枚举,里面像这样:

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。

先感谢您!

您不能实例化枚举。 这就是为什么我无法调用JNI的NewObject()方法的原因(枚举仅允许私有构造函数,因此无法进行实例化-您需要公共构造函数)。 我通过在外部类中创建一个方法来解决此问题,该方法将枚举索引作为参数并返回对应的枚举实例。 在JNI中,通过CallObjectMethod()而不是NewObject()调用该方法。

尝试类似以下的方法。 您应该访问静态字段,而不是构造枚举。

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 ;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM