因為java的最底層是jvm,所以單純的控制台java程序不能感知jvm再下面的操作系統的情況,
可以通過JNI(Java Native Interface)技術實現java后台調用C++/C的dll(Dynamic Linkable Library,動態鏈接庫)文件。
不過,對Java外部的調用通常不能移植到其他平台,在applet中還可能引發安全異常。實現本地代碼將使您的Java應用程序無法通過100%純Java測試。但是,如果必須執行本地調用,則要考慮幾個准則:
1.將您的所有本地方法都封裝到一個類中,這個類調用單個的DLL。對每一種目標操作系統平台,都可以用特定於適當平台的版本的DLL。這樣可以將本地代碼的影響減少到最小,並有助於將以后所需要的移植問題考慮在內。
2.本地方法盡量簡單。盡量使您的本地方法對第三方(包括Microsoft)運行時DLL的依賴減少到最小。使您的本地方法盡量獨立,以將加載您的DLL和應用程序所需的開銷減少到最小。如果需要運行時DLL,必須隨應用程序一起提供。
寫出java程序調用c++清屏函數的例子
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庫項目類型
(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和林清瀅老師的文檔