由于java的最底层是jvm,因此单纯的控制台java程序不能感知jvm再下面的操做系统的状况,html
能够经过JNI(Java Native Interface)技术实现java后台调用C++/C的dll(Dynamic Linkable Library,动态连接库)文件。java
不过,对Java外部的调用一般不能移植到其余平台,在applet中还可能引起安全异常。实现本地代码将使您的Java应用程序没法经过100%纯Java测试。可是,若是必须执行本地调用,则要考虑几个准则:c++
1.将您的全部本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标操做系统平台,均可以用特定于适当平台的版本的DLL。这样能够将本地代码的影响减小到最小,并有助于将之后所须要的移植问题考虑在内。安全
2.本地方法尽可能简单。尽可能使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减小到最小。使您的本地方法尽可能独立,以将加载您的DLL和应用程序所需的开销减小到最小。若是须要运行时DLL,必须随应用程序一块儿提供。app
写出java程序调用c++清屏函数的例子jvm
1,编写带有native的java类函数
public class Cls { // 声明本地方法 public native void clear(); static { //加载动态连接库DLL //要保证加载的ClsCpp.dll在你安装的jdk\jre\bin下目录 System.loadLibrary("ClsCpp"); } }
2,在cmd环境下,使用javah命令,把Cls.class编译成Cls.h文件测试
生成的Cls.h文件以下: /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" //注意把此处原来的命令#include <jni.h> 改成#include "jni.h" /* Header for class Cls */ #ifndef _Included_Cls #define _Included_Cls #ifdef __cplusplus extern "C" { #endif /* * Class: Cls * Method: clear * Signature: ()V */ JNIEXPORT void JNICALL Java_Cls_clear (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
3、建立DLL库项目类型spa
(1)在VS2010环境下,建立一个名称为ClsCpp的C++ Win32项目。在向导的应用程序类型处选择DLL操作系统
将你机器安装的jdk目录中的include文件夹下的文件jni.h和win32文件夹中的jni_md.h拷贝到ClsCpp项目的根目录中,并添加到项目中。
在这里个人复制有问题,致使找不到文件,我是新建立了文件而后代码复制过去
新建源文件Cls.cpp
#include "jni.h" #include "Cls.h" #include <stdio.h> #include <stdlib.h>//暂时不能理解这段代码的意思 JNIEXPORT void JNICALL Java_Cls_clear(JNIEnv *, jobject) { system("cls"); //在C++中能直接调用操做系统中的清屏命令 }
最后,他就会在debug里面生成dll文件
可是,这并非咱们要的,由于咱们的机子都是差很少64了吧
咱们要修改cls.cpp文件的属性
首先右键属性
把它改成64位,在解决方案文件夹会看到咱们新建立的X64文件夹,咱们顺着X64\Debug\就能够找到64位的DLL了
(4)获得ClsCpp.dll,而后把它复制到你机器安装的jdk\jre\bin文件夹下.
(5)只要添加了1中的Cls.java类, 就能使用Cls类中的本地方法clear()进行清屏(说明一下这个清屏函数只能在cmd中进行
public static void main(String args[]){ final Cls clearScreen = new Cls(); System.out.println("Hello,world"); Scanner sc = new Scanner(System.in); String temp = sc.nextLine(); clearScreen.clear(); }
参考:http://www.cnblogs.com/Alandre/p/4456719.html和林清滢老师的文档