我正面临着使用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。
主要区别在于它是一个新增的类,我似乎错过了可能导致此问题的内容。我一次又一次地重新检查,但没有得到任何明确的指标。
任何帮助表示感谢。
答案 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这样的语言应该更多地用于应用软件。