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++呢!

原创粉丝点击