Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI中的对象创建_Java_C++_Enums_Java Native Interface_Wrapper - Fatal编程技术网

Java JNI中的对象创建

Java JNI中的对象创建,java,c++,enums,java-native-interface,wrapper,Java,C++,Enums,Java Native Interface,Wrapper,我在其中有一个类和一个枚举,如下所示: 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 in

我在其中有一个类和一个枚举,如下所示:

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 ;
}
但它总是返回null


提前谢谢你

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

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

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

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

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

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

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

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


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

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

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

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

调用。您是否验证了这些名称是类的实际名称<代码>“ppmerrJNI$ppm\u err\u e”?您不检查
FindClass
是否成功。请确保
employeeClass
不是
NULL
。是的,我已检查,它不是NULL。是否可能因为枚举具有私有构造函数而无法调用枚举的构造函数?是,似乎是这样的:您是否验证过这些名称是您的类的实际名称<代码>“ppmerrJNI$ppm\u err\u e”?您不检查
FindClass
是否成功。请确保
employeeClass
不是
NULL
。是的,我已检查,它不是NULL。是否可能因为枚举具有私有构造函数而无法调用枚举的构造函数?是,似乎是这样的:您是否验证过这些名称是您的类的实际名称<代码>“ppmerrJNI$ppm\u err\u e”?您不检查
FindClass
是否成功。请确保
employeeClass
不是
NULL
。是的,我已检查,它不是NULL。是否可能因为枚举具有私有构造函数而无法调用枚举的构造函数?是,似乎是这样的:您是否验证过这些名称是您的类的实际名称<代码>“ppmerrJNI$ppm\u err\u e”?您不检查
FindClass
是否成功。请确保
employeeClass
不是
NULL
。是的,我已经检查过,它不是NULL。是否可能因为枚举有私有构造函数而无法调用枚举的构造函数?是的,似乎是这样的:我知道如何通过列表名称/字符串获取枚举值,但是我需要通过一个数字(someNumber)获取它…我知道如何通过ist名称/字符串获取枚举值,但我需要通过一个数字(someNumber)获取它…我知道如何通过ist名称/字符串获取枚举值,但我需要通过一个数字(someNumber)…我知道如何通过ist名称/字符串获取枚举值,但我需要通过一个数字(someNumber)。。。