2015-08-21 6 views
-1

У меня есть googled для этого, но результаты либо старше 10 лет, и не объясняют, что такое JNI, или это единственный подход, или результаты для C++ или C#. Итак, вот мой вопрос:Как запустить java-программу из c-программы?

Как запустить программу Java из программы на языке C, используя следующий код в качестве примера? Какие конкретные изменения я внес в следующий код, чтобы программа C успешно вызывала java-программу с параметрами?

В терминале CentOS, я в состоянии успешно запустить программу Java, когда я введите в командной строке:

java -cp . my.package.SomeClass 1 2 3 

Аналогично, из той же папки в терминале, я могу успешно запустить программу C, когда я введите в командной строке:

./hello 

код для hello.c является:

#include <stdio.h> 

main() { 
    printf("Hello World from C!\n"); 
} 

Как мне изменить код для hello.c, чтобы он также запускал my.package.SomeClass с параметрами 1 2 3?

Например, как я выполняю следующее, но без метания ошибок:

#include <stdio.h> 

main() { 
    printf("Hello World from C!\n"); 
    java -cp . my.package.SomeClass 1 2 3 //What is the right syntax here? 
} 

EDIT

Ради будущих читателей этого, и, чтобы избежать избыточной сообщения, пожалуйста, также укажите в своем ответе, как назвать метод, например SomeClass.someMethod(1,2,3);

+0

Откат, когда вы полностью изменили вопрос, предоставив существующие ответы неполными (включая принятый). – Olaf

+0

На редактирование отвечают ответы ниже, в которых указывается требуемая библиотека, и указывается на дальнейшие исследования. Сохранение редактирования поможет таким людям, как я, которые вынуждены писать краткий код C и нуждаются в кратком обзоре. – CodeMed

+0

Довольно высокомерное ваше C-трески. Вы должны сначала подумать, можете ли вы оскорбить людей, которые на самом деле предпочитают C для своих проектов. Распространение вопроса противоречит политике SO. – Olaf

ответ

2

Если все вы хотите сделать, это запустить java -cp . my.package.SomeClass 1 2 3 из вашей программы, вы могли бы просто использовать system, которая запускает внешнюю команду:

system("java -cp . my.package.SomeClass 1 2 3"); 

Это самое простое решение, но не очень гибкий - вы не можете взаимодействовать с Java-программой, кроме, например, аргументов.

+0

Это замечательно, но ради других в будущем вы можете просто исследовать все, указав также, как запустить метод класса java с параметрами, как показано в редактировании, которое я только что добавил в мой OP? – CodeMed

+1

@CodeMed Вы не можете сделать это напрямую без JNI. JNI - это интерфейс, который позволяет вам получить доступ к JVM с C. – immibis

+0

Я отмечаю ваш ответ как самый короткий. Один последний запрос, вы можете показать, как 1, 2 и 3 будут выглядеть как переменные вместо констант. Переменные могут быть более полезными для других, которые читают это в будущем. Спасибо. – CodeMed

2

Вам нужно использовать JNI (насколько я знаю). Я использую документацию здесь все время:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/

Это немного немногословные, но это работоспособное. Он обрабатывает C и C++. Я не знаю C#, поэтому я не могу прокомментировать это (хотя, если вы заставили угадать, я бы сказал, что нет C#).

Запуск вашей Java-программы с C потребует, чтобы вы запускали JVM программно с помощью функций JNI, затем находили свой класс, затем находили свой метод и затем вызывали его. Есть примеры здесь, чтобы вы начали:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502

Если вам нужна дополнительная помощь, вы, возможно, потребуется, чтобы найти кого-то, кто сделал это, прежде чем идти Вы через шаги.

2

Я считаю, что вы ищете семейство функций exec.Нечто подобное,

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
     const char *file = "java"; 
     const char *arg = "-cp . my.package.SomeClass 1 2 3"; 
     printf("Hello World from C!\n"); 
     execlp(file, arg, (char *) NULL); 
} 
+0

Это замечательно, но ради других в будущем вы можете просто исследовать все, указав также, как запустить метод класса java с параметрами, как показано в редакции, которую я только что добавил в мой OP? – CodeMed

+3

@CodeMed Это совсем другой вопрос. Java VM, как правило, написана на C++, поэтому (afaik) вам нужно начать с написания большого количества кода прокладки и [JNI] (http://stackoverflow.com/questions/15560572/using-jni-to-execute -a-Java-банку-из-AC-программы с использованием-г-или-Eclipse). Кроме того, вы можете использовать механизм RPC, такой как SOAP, ReST, CORBA, Thrift или Sockets. –

Смежные вопросы