jni对getClass的调用对job对象返回null

jni call to getClass returns null for a jobject

本文关键字:对象 返回 null job 调用 getClass jni      更新时间:2023-10-16

我正面临着使用JNI从c++代码进行java调用的问题。我能够获得作业对象,但是对作业对象上的任何API的调用都失败了。经过近一天的挖掘,并与其他工作的Java API(我在代码中调用的对象)进行比较,我发现了一个不同之处。

下面的代码

void printClassInfo(JNIEnv* env, jobject object, jclass klazz)
{
    printf("printclass info 1n");
    printf("printclass info 2n");
    // First get the class object
    jmethodID mid = env->GetMethodID(klazz, "getClass", "()Ljava/lang/Class;");
    printf("printclass info 2.1n");
    jobject clsObj = env->CallObjectMethod(object, mid);
    printf("printclass info 3n");
    if(clsObj == NULL){
        printf("cls obj is null");
    }
}

打印cls obj为null的工作对象,我看到的问题。

对于其他对象,调用不返回null。

主要的区别是它是一个新添加的类,我似乎错过了一些可能导致这个问题的东西。我一遍又一遍地检查,但没有得到任何明确的指示。

感谢您的帮助。

您已经有object了。为什么你需要它的类(抱歉是klass)呢?JNI有一个网卡功能,GetObjectClass(jobject)。你可以这样做:

void printClassInfo(JNIEnv* env, jobject object) {
   jclass clsObj = env->GetObjectClass(env, object);
   if (clsObj == NULL) {
    printf("cls obj is null");
   }
}

这能解决你的问题吗?

我能够找到解决方案。以下是我的问题所在,希望能对别人有所帮助。

Java API正在返回列表,并在调用后的JNI中,我试图将其视为jobjectArray,这显然不会起作用,因为在JNI术语中,它将是一个工作对象,我们必须将其视为一个工作对象(如果这是错误的,请纠正我)。我遵循已经到位的实现,但似乎它们从未经过测试。

真正让我困惑的行为是,它从来没有抱怨我正在做的类型转换,将其转换为jobjectarray,甚至让我遍历损坏的jobjectarray,甚至提取损坏的元素。我花了一段时间才解决这个问题。

所有这些都让我想到,像Haskell这样具有强类型推断的语言应该更多地用于应用软件。