java - JNI 中的对象创建

标签 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 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) 我得到:“线程“主”java.lang.NoSuchMethodError 中的异常:”。

基本上,我想调用枚举类型“ppm_err_e”的构造函数,它位于类“ppmerrJNI”中。我想返回一个基于 someNumber 数字的枚举对象,这是我采用的方法;也可以接受任何其他可能的解决方案。

我也尝试过:

jmethodID constructor = (*env)->GetMethodID(env, enumClass, "getObj", "(I)LppmerrJNI$ppm_err_e;");

但它总是返回 null。

提前致谢!

最佳答案

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

关于java - JNI 中的对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25247893/

相关文章:

java - Android 数据库 - 将 Intent 字符串传递给游标

java - 存储枚举类引用

java - 方法编译出现 "missing return statement"错误

c++ - 使用 Openscenegraph 加载纹理时出错

c++ - 递归调用段错误问题

C++ select() 不等待超时时间

C++ 打包 typedef 枚举

c# - 测试单个值的 [Flags] 枚举值

java - ibm mq + ssl + 自签名证书

java - ArrayList 返回 null 的方法