如何从C ++中调用java

时间:2010-04-06 08:23:02

标签: java c++ jar

我需要从我的c ++程序中运行这一行:

java -jar test.jar text1 text2

java应用程序将给出一个浮点值并将其提供给c ++程序。

我该怎么做?我从来没有在我的ms visual studio C ++文件中调用java的东西。

4 个答案:

答案 0 :(得分:4)

如果您想使用强耦合JNI wrapper

答案 1 :(得分:0)

一个简单的解决方案是使用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);

答案 2 :(得分:0)

当我在命令提示符下直接运行java命令时,它可以工作。但是当我从c ++文件运行命令时,错误显示“系统无法执行指定的程序”。

这是我的代码,即时通讯使用ms 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;
}

答案 3 :(得分:-1)

如果您可以修改您的Java代码,这是最简单的:

将结果写入环境变量(下面的伪代码):

解决方案1。 (直接写入java app中的env。)

的java:

...
setenv('ret', somefloatvalue);
...

exit..

C ++:

system("java -jar test.jar text1 text2")
...
getenv("ret")

(我没有测试过,但这里重要的是上下文,系统是否会创建另一个shell(控制台), 如果是的话,你将看不到那些环境,因此需要一些其他的生成方法)

Windows上的

CreateProcess() Linux上的 fork()

还有更复杂的解决方案,

  • 通过套接字发送一些JASON ......等等。
  • 在java中写入文本文件,读入 C ++。
  • MPI ...
  • 极端在这种情况下CORBA;)