6

我在使用 JNI 从 C++ 代码进行 java 调用时遇到问题。我能够获取作业,但在作业上调用任何 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");
    }
}

prints cls obj is null 对于我看到问题的作业。

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

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

任何帮助表示赞赏。

4

2 回答 2

14

你已经object有了。为什么你需要它的类(对不起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");
   }
}

这会解决你的问题吗?

于 2014-03-20T16:30:06.867 回答
0

我能够找到解决方案。这是哪里出了问题,以防它对其他人有帮助

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

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

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

于 2014-03-22T13:29:33.813 回答