Использование JNI для вызова метода Java из C ++, который имеет не примитивный вывод - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь вызвать следующий метод Java (из внешнего файла JAR) из C ++

Game game = GameLoader.loadGameFromName("My game name");

Где сигнатура функции для loadGameFromName равна

public static Game loadGameFromName(String name)

и GameLoader - публичный финальный класс Java.Также Game является общедоступным конечным классом.

Код, который я использовал для попытки вызвать этот метод:

jclass gameLoader = env->FindClass("player/GameLoader");
jmethodID mid = env->GetStaticMethodID(gameLoader,"loadGameFromName","(Ljava/lang/String;)Lgame/Game");

Здесь класс gameLoader был успешно найден в первой строкеоднако метод loadGameFromName не был найден во второй строке.

Также может иметь значение, что мне удалось успешно вызвать метод, отличный от GameLoader, который был

String[] games = GameLoader.listGames()

со следующим кодом

jclass gameLoader = env->FindClass("player/GameLoader");
jmethodID mid = env->GetStaticMethodID(gameLoader,"listGames","()[Ljava/lang/String;");
jobjectArray stringArray = (jobjectArray) env->CallStaticObjectMethod(gameLoader,mid);

Так что код работает нормально.Таким образом, похоже, что основное отличие здесь в том, что loadGameFromName возвращает объект Game, а не строковый объект Java.Также может быть уместно отметить, что я могу успешно найти класс Game с jclass game = env->FindClass("game/Game");.

Что-то не так с тем, как я называю GetStaticMethodID для метода loadGameFromName?Я попытался найти примеры вызова методов Java с помощью JNI, которые возвращают произвольные объекты Java, такие как Game, но я не смог их найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...