对getClass的jni调用为jobject返回null 我面临的问题是用JNI从C++代码中调用java。我能够获取jobject,但是jobject上任何API的调用都失败。 经过近一天的挖掘,并与其他正在工作的JavaAPI(我在代码中调用的作业对象)进行比较,我发现了一个区别

对getClass的jni调用为jobject返回null 我面临的问题是用JNI从C++代码中调用java。我能够获取jobject,但是jobject上任何API的调用都失败。 经过近一天的挖掘,并与其他正在工作的JavaAPI(我在代码中调用的作业对象)进行比较,我发现了一个区别,java,c++,java-native-interface,jnienv,Java,C++,Java Native Interface,Jnienv,下面的代码 void printClassInfo(JNIEnv* env, jobject object, jclass klazz) { printf("printclass info 1\n"); printf("printclass info 2\n"); // First get the class object jmethodID mid = env->GetMethodID(klazz, "getClass", "()Ljava/lang/C

下面的代码

void printClassInfo(JNIEnv* env, jobject object, jclass klazz)
{
    printf("printclass info 1\n");
    printf("printclass info 2\n");

    // First get the class object
    jmethodID mid = env->GetMethodID(klazz, "getClass", "()Ljava/lang/Class;");
    printf("printclass info 2.1\n");
    jobject clsObj = env->CallObjectMethod(object, mid);
    printf("printclass info 3\n");
    if(clsObj == NULL){
        printf("cls obj is null");
    }
}
对于我看到问题的jobject,prints cls obj为null

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

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


感谢您的帮助。

您已经有了
对象。为什么您需要它的类(抱歉
klass
)?JNI为您提供了一个nic函数,
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术语中,它将是jobject,我们必须将其视为jobject(如果这是错误的,请纠正我)。我遵循了已经到位的实现,但似乎从未经过测试

真正让我困惑的是,它从来没有抱怨过我将其转换为jobjectarray的类型转换,甚至让我遍历损坏的jobjectarray,甚至提取损坏的元素。我花了一段时间来排除故障


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

当你称之为klazz时,klazz的价值是什么?看起来你回答了自己的问题:
主要区别在于它是一个新添加的类
。它很可能从未加载新的类定义,并且klazz为NULL。检查你的类路径。