Как вызвать функции Java из С++?

Как я могу вызвать функции Java из приложения С++?

Я знаю о вызове их из CMD (или подобных методов), но я бы предпочел не использовать их.

Ответы

Ответ 1

В качестве примера проверьте Создание JVM с C. Он показывает пример процедуры для создания JVM и вызова метода. Если JVM уже существует; например ваша программа C вызывается программой Java (ситуация обратного вызова), вы можете кэшировать указатель JNIEnv *.

В качестве совета, будьте осторожны с указателями кэширования в JVM с C/С++, есть некоторые семантики, связанные с тем, что вы можете кэшировать, и это может быть вызвано позже. Для этого, как указал Брайан Агне, проверьте ссылку JNI.

Ответ 2

Обратите внимание на интерфейс вызова JNI. Это позволит вам внедрить JVM в ваше приложение C (или С++).

Обратите внимание, что существуют различные более простые механизмы, облегчающие вызов C/С++ из Java (например, JNA). Возможно, стоит рассмотреть вопрос о переводе вашей проблемы, чтобы вы могли звонить с Java (я понимаю, что это может быть не всегда возможно для вашего конкретного приложения)

Ответ 3

Прочитайте JNI.

Ответ 4

Эта страница поможет: 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.

Ответ 6

Еще один простой способ вызова java-методов из CPP - это пакетный файл.

system() 

Является ли метод вызова exe или bat файлов из CPP. Поместите свой класс с помощью пути java и classpath в пакетном файле и вызовите этот пакетный файл из CPP с помощью system("batch-file-name.bat").

Это легко и прямо.