2014-07-23 58 views
0

我有一个Java GUI和一个C程序。 C程序计算给定值(参数)。我想在Java中调用C计算器,并将标签更改为GUI中的返回值(标签几乎每秒都会更改)。Java和C之间传递值

我想一些办法,

  1. Socket编程(可能在同一台计算机上效率不高)

  2. 文件操作(Java写的输入,C基于那么Java读取计算值)

  3. JNICALL的东西,但我不知道如何从c文件中获得价值。

  4. 的共享内存(我不知道窗口SHM想法)

什么是解决这个问题的最好方法是什么?

+2

问题太广泛了。你最好尝试一下你提出的解决方案,然后再回答关于实际代码的问题。一个好办法(我忘记在java中如何完成它)是为C程序创建进程,并重定向stdout来捕获它的输出。 –

+0

为什么你有两个不同的程序有什么特别的动机? – vz0

+0

@DrewMcGowen你写的是JNICALL的东西。 – Duke

回答

1

如果你的C程序是一个带有export functions的DLL,你可以看看JNA

请记住,从过去的项目,它很好地工作,而不必自己做JNI位。

0

我不得不在我的工作上做类似的事情,我用C++编写了一个帮助程序来访问一些定制的数据库,而我的主应用程序是用Java编写的。数据库API仅适用于C++程序。

我所做的是从Java启动C++进程,并通过命令行参数和stdout进行通信。

List<String> cmdPathAndArgs = Arrays.asList("/path/to/binary", "--arg1", "--arg2"); 
    ProcessBuilder pb = new ProcessBuilder(cmdPathAndArgs); 
    Processpp = pb.start(); 
    InputStream stream = pp.getInputStream(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 

    InputStream errorStream = pp.getErrorStream(); 
    BufferedReader errorBr = new BufferedReader(new InputStreamReader(errorStream)); 

如果您的程序在stdout和stderr中都生成输出,则可能会陷入死锁。您应该定期清空这两个流。

0

如果您可以将您的C代码构建到共享库中,那么JNI可能是您最好的选择。套接字将足够快速地处理每秒1次更新。使用文件可能会比套接字慢。共享内存也不错,但我认为套接字可能是一个更简单的接口,用于你想要做的事情。