java调用c++的东西(内有转载的内容)
来源:互联网 发布:空知猩猩神乐门 编辑:程序博客网 时间:2024/06/05 17:19
项目需要,要从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++呢!
- java调用c++的东西(内有转载的内容)
- 人十种最美的东西(转载)
- 转载的好东西
- 转载别人的东西,。!
- 转载的好东西
- 转载的一些东西
- Android上的C/C++调用Java问题(转载)
- Java内部类的调用
- java读取exle内的内容。
- Java删除文件夹内的所有内容
- Java清空某文件夹内的所有内容
- 转载的关于java学习的一些东西
- JAVA 内部类的简单总结 (转载)
- 转载Java内部类的使用小结
- 【转载】Java内部类的使用小结
- Java软件架构师需要的东西(转载)
- Java软件架构师需要的东西{转载}
- java内存管理机制-转载保存有价值的东西
- 数据库相关:Log4j和JDBMonitor的比较
- 一步一个脚印重头开始!
- 密钥文件snk
- Java入门:Redhat9下的java中文问题解决
- 一个Web操作系统 Windows4all
- java调用c++的东西(内有转载的内容)
- TD8.0移植到QC9.2
- J2SE综合--JAVA实现把汉字转化成拼音
- 24 个漂亮的个性化 HTML 表单技术
- 开发人员如何谈加薪,抛砖引玉
- 【转载】windows下进程间通信方式
- Make your function support multi args (paras).
- J2SE API读取Properties文件的六种方法
- UTF-8到acsii的转换(让自己的C++程序支持多语言)