java——JNI(例子控制台(64位)清屏


因為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和林清瀅老師的文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM