Как я могу вызвать функции Java из приложения С++?
Я знаю о вызове их из CMD (или подобных методов), но я бы предпочел не использовать их.
Как я могу вызвать функции Java из приложения С++?
Я знаю о вызове их из CMD (или подобных методов), но я бы предпочел не использовать их.
В качестве примера проверьте Создание JVM с C. Он показывает пример процедуры для создания JVM и вызова метода. Если JVM уже существует; например ваша программа C вызывается программой Java (ситуация обратного вызова), вы можете кэшировать указатель JNIEnv *.
В качестве совета, будьте осторожны с указателями кэширования в JVM с C/С++, есть некоторые семантики, связанные с тем, что вы можете кэшировать, и это может быть вызвано позже. Для этого, как указал Брайан Агне, проверьте ссылку JNI.
Обратите внимание на интерфейс вызова JNI. Это позволит вам внедрить JVM в ваше приложение C (или С++).
Обратите внимание, что существуют различные более простые механизмы, облегчающие вызов C/С++ из Java (например, JNA). Возможно, стоит рассмотреть вопрос о переводе вашей проблемы, чтобы вы могли звонить с Java (я понимаю, что это может быть не всегда возможно для вашего конкретного приложения)
Прочитайте JNI.
Эта страница поможет: http://hildstrom.com/projects/jni/index.html
Предположим, что у вас есть класс Java:
package foo;
public class bar {
public static int timesTen(int input){
return input * 10;
}
}
Как только у вас есть JVM и JNIEnv * (подробности опущены...), вы можете вызвать метод Java из С++ следующим образом:
jclass myClass = env->FindClass("foo.bar");
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I");
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10);
Это замаскирует много деталей, включая обработку исключений, которые, если они опущены, приведут к краху вашей JVM. Для всех поисковых запросов gory в "Java Native Interface" и следуйте ссылкам Oracle.
Sun имеет очень хороший и базовый пример JNI.
Еще один простой способ вызова java-методов из CPP - это пакетный файл.
system()
Является ли метод вызова exe или bat файлов из CPP. Поместите свой класс с помощью пути java и classpath в пакетном файле и вызовите этот пакетный файл из CPP с помощью system("batch-file-name.bat")
.
Это легко и прямо.