使用Java如何去调用没察C语言的接口呢?使用Java的JNI技术。
具体调用步骤如下:
1.首先创建Java文件 HelloJni.java ,并创建native方法。
2.编译Java文件并生成java头文件。
3.创建C语言文件,HelloWorld.c。
4.生成动态链接库文件 libhello.so。
5.设置动态链接裤如库文件的目录。
6.把刚才生成的so文件拷贝到/home/lib下,然后执行class文件。
用 Runtime 的 exec 方法的确是可行的。假设我们已经把以下的慧喊 C 程序编绎成 adder.exe:
#include <stdio.h>
int main() {/* 简单地循环打印标准输入上的两个整数之和 */
int a, b, lineNumber = 0
while (scanf("%d %d", &a, &b))
printf("Line# %d \t %d + %d == %d\n", ++lineNumber, a, b, a + b)
return 0
}
以下的 Java 程序可以在启动 adder.exe 后,跟 adder.exe 的标准输入和输出接轨,然后持续不断地向它发送数据和索取结果:
import java.io.*
class C {
public static void main(String[] args) throws Exception {
final Process proc = Runtime.getRuntime().exec("adder.exe")
// 用另一个线程把参数送到早伍 proc 的标准输入上去。
new Thread() {
public void run() {
OutputStream stdin = proc.getOutputStream()
for (int i = 0i++) {
try {
Thread.sleep(1) // 要休息片刻才看得到 I/O 的缓陆碧或存效果。
stdin.write((i + " " + i + "\n").getBytes())
} catch (Exception ex) {
ex.printStackTrace()
}
}
}
}.start()
// 主线程负责读取并打印 proc 的标准输出。
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()))
for (String linenull != (line = stdout.readLine()))
System.out.println(line)
}
}
循环里的 Thread.sleep(1) 纯粹是为了凸显 I/O 的缓存效果。
我测试时看到大约 900 行的缓存量(用 32-bit XP 和 Java 1.6)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)