我需要从我的C运行这行++程序的java:如何调用从C++
Java的罐子Test.jar的文本1文本2
的Java应用程序会给出一个浮点值,并把它交给C++程序。
我该怎么做?我从来没有从我的ms visual studio C++文件中调用java的东西。
我需要从我的C运行这行++程序的java:如何调用从C++
Java的罐子Test.jar的文本1文本2
的Java应用程序会给出一个浮点值,并把它交给C++程序。
我该怎么做?我从来没有从我的ms visual studio C++文件中调用java的东西。
当我直接在我的命令提示符下运行java命令,它工作。但是当我从C++文件运行命令时,错误显示“系统无法执行指定的程序”。
这里是我的代码,使用MS IM Visual Studio 2005中:
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
float value;
FILE *child = _popen("java -jar c:\simmetrics_jar_v1_6_2_d07_02_07.jar text1 ssdyr445", "r");
if (fscanf(child, "%f", &value) == 1)
{
fprintf(stdout,"Got Value from simmetrics: %f\n", value);
}
else
{
fprintf(stdout,"ERROR\n");
}
fclose(child);
return 0;
}
如果要使用强耦合,请使用JNI wrapper。
最简单的,如果你可以修改你的Java代码:
结果写入到环境变量(伪下面的代码):(。在Java应用程序直接写ENV)
解决方案1.
的java:
...
setenv('ret', somefloatvalue);
...
exit..
C++:
system("java -jar test.jar text1 text2")
...
getenv("ret")
(我还没有测试,但这里重要的是背景下,的确系统创建另一个shell(控制台), 如果是,你不会看到这些ENVS,因此其他一些产卵方法是必要的)
CreateProcess() on windows fork()在linux上。
也有更复杂的解决方案,
一个简单的解决方案是使用POPEN()和pclose函数()。
函数popen(),forks()和execs()是一个子进程。但它将子流程标准化并标准化了由popen创建的流对象。因此,在母体书面方式任何给流将其发送到子过程的标准中,而任何子过程写入标准出可以从由父流中读取:
double value;
FILE* child = popen("java -jar test.jar text1 text2", "r");
if (fscanf(child, "%f", &value) == 1)
{
fprintf(stdout,"Got Value: %f\n", value);
}
else
{
fprintf(stdout,"ERROR\n");
}
fclose(child);
我试过了代码,但仍然无法使用。它以某种方式不传递来自jar应用程序的float值。 的#include
您是否检查popen的结果?如果它无法启动Java虚拟机或无法找到该jar文件,则会产生错误。 – 2010-04-07 15:33:06
为什么你不接受您的任何问题的答案? – Shaihi 2010-04-06 10:11:34
我不知道我需要接受答案。顺便说一下,如何接受? – karikari 2010-04-06 11:59:06
看起来像他“接受”了他自己的“答案”,这是另一个问题>。< – Kayvar 2013-03-21 21:44:43