Как я могу вызвать функции Java из приложения на C++?Как вызвать функции Java из C++?
Я знаю о вызове их из CMD (или подобных методов), но я бы предпочел не использовать их.
Как я могу вызвать функции Java из приложения на C++?Как вызвать функции Java из C++?
Я знаю о вызове их из CMD (или подобных методов), но я бы предпочел не использовать их.
В качестве примера, проверьте Creating a JVM from C. Он показывает пример процедуры для создания JVM и вызова метода. Если JVM уже существует; например ваша программа C вызывается программой Java (ситуация обратного вызова), вы можете кэшировать указатель JNIEnv *.
Как совет, будьте осторожны с указателями кэширования в JVM из C/C++, есть некоторые семантики, связанные с тем, что вы можете кэшировать, и это может быть вызвано позже. Для этого, как указал Брайан Агне, проверьте ссылку JNI.
Читайте также: JNI.
Я знаю, что с помощью JNI можно вызывать функции C++ из Java, но как вы можете использовать его для вызова функций Java из C++? –
@AndersonGreen Да, можно вызвать Java-методы из C++. К сожалению, есть гораздо больше информации о вызове C++ из Java, но я нашел пару учебников, http://www.ibm.com/developerworks/java/tutorials/j-jni/section3.html и http: //www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI. У меня были некоторые проблемы с каждым учебным пособием, и в учебнике IBM есть некоторые тревожные несоответствия, но это лучшее, что я могу найти в это время. – StockB
Проверьте JNI Invocation interface. Это позволит вам встроить JVM в приложение C (или C++).
Обратите внимание, что существуют различные более простые механизмы, облегчающие вызов C/C++ из Java (например, JNA). Это может быть стоит рассмотреть инвертирование проблемы таким образом, что вы можете позвонить из Java (я понимаю, это вполне может оказаться невозможным для вашего конкретного применения, однако)
Это не ваша ошибка, но ссылка интерфейса интерфейса JNI нарушена.Кажется, Oracle переместил каждый ресурс JNI, который у них был, поскольку неработающие ссылки повсюду ищут информацию JNI. – StockB
Похоже, что эта ссылка была исправлена сейчас –
Солнце имеет very good and basic example of 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 от C++ следующим образом:
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.
Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Perception
Еще один простой способ вызова java-методов из CPP - пакетный файл.
system()
Это метод вызова exe или bat-файлов с CPP. Поместите свой класс с помощью пути Java и пути к классам в пакетном файле и вызовите этот пакетный файл из CPP, используя system("batch-file-name.bat")
.
Легко и прямо.
Этот тип вызова - то, что им нужно. вопрос в том, что такое con's этого метода. – user63898
сложность. но я считаю, что без сторонних инструментов единственный метод из того, что я прочитал. – bbqchickenrobot