jni对getClass的调用为jobject返回null

时间:2014-03-20 10:55:04

标签: java c++ java-native-interface jnienv

我正面临着使用JNI从C ++代码进行java调用的问题。我能够获得jobject,但是jobject上的任何API的调用都会失败。 在挖掘将近一天并与其他工作Java API(我在我的代码中调用的jobjects)进行比较时,我发现了一个区别。

以下代码

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

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

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

主要区别在于它是一个新增的类,我似乎错过了可能导致此问题的内容。我一次又一次地重新检查,但没有得到任何明确的指标。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:12)

您已经拥有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");
   }
}

这会解决您的问题吗?

答案 1 :(得分:0)

我能够找到解决方案。 这是错的,以防它对别人有帮助

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

让我感到困惑的是,它从未抱怨我正在做的类型转换将其转换为jobjectarray,甚至让我遍历损坏的jobjectarray甚至提取损坏的元素。我花了一些时间进行故障排除。

所有这些让我觉得,像Haskell这样的语言应该更多地用于应用软件。