jni对getClass的调用对job对象返回null
jni call to getClass returns null for a jobject
我正面临着使用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这样具有强类型推断的语言应该更多地用于应用软件。
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用