项目需要,要从java里边调用c++写的一个模块,我本想用jni(java native interface)来着,用那个工程的dll文件,用native method 来加载。网上某位达人手把手教程序如下:
package jni;
public class CallDll {
static {
System.loadLibrary("CallDll");// no suffix,like .dll or .so
}
public native int getSquare(int i);
public static void main(String[] args) {
CallDll invoker = new CallDll();
int j = invoker.getSquare(4);
System.out.println(j);
}
}
1.再用 javah CallDll.java 将上述类变为 .h 文件,内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CallDll */
#ifndef _Included_CallDll
#define _Included_CallDll
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_CallDll_getSquare
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
2.在vc中新建一个dll文件的工程,然后将这个投文件include,据此头文件写dll工程下的cpp文件,内容如下:
// CallDll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "CallDll.h"
#include "jni.h"
#include "jawt_md.h"
#include "jni_md.h"
JNIEXPORT jint JNICALL Java_CallDll_getSquare(JNIEnv *env, jobject obj, jint p)
{
int j = p*p;
return j;
}
3.按F7进行编译,然后将debug下的CallDll.dll拷到java类目录下,运行java程序即可。
本来想用上述的这一套方法的,但是太繁琐了,因为要将一个整个的工程变为dll的东西,而且这个工程里还调用了很多非程序类的外部资源,所以我想到了用另外一个方法:用java调用exe的方法(我可以修改c++程序将其输入输出位置确定,从而不用java和exe之间互相传递参数),网上找到的程序如下(这个版本在网上有很多,被转载的很厉害,呵呵)
1.0 用Java调用windows系统的exe文件,比如notepad,calc之类:
public class Demo{
public static void main(String args[]){
Runtime rn=Runtime.getRuntime();
Process p=null;
try{
p=rn.exec(notepad);
}catch(Exception e){
System.out.println("Error exec notepad");
}
}
}
2.0调用其他的可执行文件,例如:自己制作的exe,或是下载安装的软件
public class Demo{
public static void main(String args[]){
Runtime rn=Runtime.getRuntime();
Process p=null;
try{
p=rn.exec("/"D:/AnyQ/AnyQ.exe/"");
}catch(Exception e){
System.out.println("Error exec AnyQ");
}
}
}
(文章来源: baike.duba.net)
上面是我搜到的程序,但是运行却看不到任何东西,运行时一闪即停,再搜,有人说是没有输出位置的问题,即那个程序运行了,但是输出终端不是eclipse的控制台,所以看不到,并给出程序如下:
try {
p = rn.exec("test.exe");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((ss = bufferedReader.readLine()) != null)
System.out.println(ss);
} catch (Exception e) {
System.out.println("Error to run the exe");
}
其中改动是用一个BufferedReader将输出吸收并输出在eclipse控制台,这样再运行就可以了。呵呵,真是一波三折。谁让你用java调c++呢!