вызов java для getClass возвращает null для объекта

Я сталкиваюсь с проблемами при выполнении вызова Java из кода C ++ с использованием JNI. Я могу получить задание, но не удается вызвать любой API на задании.
При копании в течение почти одного дня и сравнении с другим рабочим Java API (рабочие объекты, которые я называю в моем коде), я обнаружил одно отличие.

следующий кусок кода

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 для объекта задания, для которого я вижу проблемы.

Для других рабочих мест вызов не возвращает ноль.

Основное отличие состоит в том, что это недавно добавленный класс, и я, кажется, упустил что-то, что может вызвать эту проблему. Я перепроверил снова и снова, но не получил никаких четких показателей.

Любая помощь приветствуется.

5

Решение

У тебя есть 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");
}
}

Это решит вашу проблему?

11

Другие решения

Я смог найти решение.
Вот что было не так, в случае, если это может помочь другим

Java API возвращал List и в JNI после вызова я пытался рассматривать его как jobjectArray, который, очевидно, не будет работать, потому что в терминах JNI это будет jobject, и мы должны рассматривать его как jobject (поправьте меня, если это не верно). Я следил за реализациями, которые уже были на месте, но, кажется, они никогда не тестировались.

Поведение, которое меня по-настоящему озадачило, заключалось в том, что он никогда не жаловался на приведение типов, которое я делал, чтобы преобразовать его в массив заданий и даже позволить мне просматривать поврежденный массив заданий и даже извлекать поврежденный элемент. Это заняло у меня некоторое время для устранения неполадок.

все это заставило меня задуматься, языки наподобие Haskell с их строгим выводом типов должны больше использоваться для прикладных программ.

0

По вопросам рекламы [email protected]