我已经搜索了这个,但是结果要么已经超过10年了,也没有解释JNI是什么,或者它是唯一的方法,还是C ++或C#的结果。所以这是我的问题:
如何使用以下代码作为示例从C程序运行Java程序?我对以下代码进行了哪些具体更改,以使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?
}
编辑
为了将来读者的目的,并避免多余的帖子,请在答案中说明如何调用方法,例如SomeClass.someMethod(1,2,3);
答案 0 :(得分:2)
你确实需要使用JNI(据我所知)。我一直在这里使用文档:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/
它有点简洁,但它可行。它处理C和C ++。我不知道C#,所以我不能对此发表评论(虽然如果被迫猜测我会拒绝C#)。
从C运行java程序将要求您使用JNI函数以编程方式启动JVM,然后找到您的类,然后找到您的方法,然后调用它。这里有一些例子可以帮助您入门:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502
如果您需要更多帮助,可能需要先找一个完成此操作的人来指导您完成这些步骤。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
如果你要做的 all 是从你的程序运行java -cp . my.package.SomeClass 1 2 3
,你可以使用运行外部命令的system
:
system("java -cp . my.package.SomeClass 1 2 3");
这是最简单的解决方案,但不是很灵活 - 例如,除了提供参数之外,您无法与Java程序进行交互。