Я сталкиваюсь с проблемами при выполнении вызова 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 для объекта задания, для которого я вижу проблемы.
Для других рабочих мест вызов не возвращает ноль.
Основное отличие состоит в том, что это недавно добавленный класс, и я, кажется, упустил что-то, что может вызвать эту проблему. Я перепроверил снова и снова, но не получил никаких четких показателей.
Любая помощь приветствуется.
У тебя есть 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 возвращал List и в JNI после вызова я пытался рассматривать его как jobjectArray, который, очевидно, не будет работать, потому что в терминах JNI это будет jobject, и мы должны рассматривать его как jobject (поправьте меня, если это не верно). Я следил за реализациями, которые уже были на месте, но, кажется, они никогда не тестировались.
Поведение, которое меня по-настоящему озадачило, заключалось в том, что он никогда не жаловался на приведение типов, которое я делал, чтобы преобразовать его в массив заданий и даже позволить мне просматривать поврежденный массив заданий и даже извлекать поврежденный элемент. Это заняло у меня некоторое время для устранения неполадок.
все это заставило меня задуматься, языки наподобие Haskell с их строгим выводом типов должны больше использоваться для прикладных программ.