在j**a中,有時候我們不得不要去使用其他語言的**,比如說:
1、你的應用需要訪問系統的各個特性和裝置,這些特性和裝置通過j**a平台是無法訪問的。
2、你已經有了大量的測試過和除錯過的用另一種語言編寫的**,並且知道如何將其匯出到所有的目標平台上。
3、通過基礎測試,你已經發現所編寫的j**a**比用其他語言編寫的等價**要慢得多。
j**a平台有乙個用於和本地c**進行互操作的api,稱為j**a本地介面(jni)。現在就開始學習jni,先從這篇的乙個最簡單的例子,了解如何使用jni呼叫本地方法。
呼叫本地方法,列印出helloworld的步驟示例
1、在類中宣告乙個本地方法
package com.tao.test;
public class nativetest
我們使用native關鍵字,宣告了乙個本地方法,而且我們還將他宣告為static。本地方法可以是靜態的,也可以不宣告為靜態的。
2、編譯.j**a檔案,生成 含有該本地方法的類的位元組碼
如果是在eclipse中,進入工程目錄》\bin\com\tao\test,就可以找到eclipse自動為我們編譯的.class檔案。
如果不是,則進入進入nativetest.j**a檔案所在的目錄,使用j**ac命令編譯該j**a類,生成了nativetest.class位元組碼。
3、使用j**ah命令編譯.class位元組碼,生成包含native方法宣告的c/c++標頭檔案
如果是在eclipse中,進入工程目錄》\bin目錄,然後使用下面的編譯命令(如果不是eclipse,則根據上面編譯生成的.class檔案的位置來用j**ap編譯)
1.j**ah com.tao.test.nativetest //記住要使用型別的全限定名稱
就會在bin目錄下,生成我們需要的c\c++標頭檔案 com_tao_test_nativetest.h (標頭檔案的名字www.cppcns.com帶包名,且用_ 分隔),裡面內容如下:
/* do not edit this file - it is machine generated */
#include
/* header for class com_tao_test_nativetest */
#ifndef _included_com_tao_test_nativetest
#define _included_com_tao_test_nativetest
#ifdef __cplusplus
extern "c"
#endif
#endif
4、按照生成的c/c++標頭檔案來寫c/c++原始檔,並編譯為dll動態鏈結庫
我們之前得到了包含native方法宣告的c/c++標頭檔案,現在我們按照這個標頭檔案,編寫我們的c\c++原始檔,並編譯為dll動態鏈結庫。
上一步,我們得到了com_tao_test_nativetest.h標頭檔案。
①、首先。新建乙個win32 dll專案(我使用的是vs2005開發環境,vc6.0++是新建乙個win32 dynamic-link library)
新建——>專案——>visual c++——>win32——>控制台應用程式——>輸入專案名稱,我使用為nativecall
點選確定後,進入下面的介面
點選下一步,進入下一介面,勾選為dll和空專案。
這樣就建立了乙個win32 dll專案了。
②、新增com_tao_test_nativetest.h標頭檔案
將com_tao_test_nativetest.h標頭檔案複製,黏貼到nativecall/nativecall/目錄下,如e:\vcproject\nativecall\nativecall該資料夾。然後再vs2005中的專案中,新增該標頭檔案
③、新增jni.h和
開啟com_tao_test_nativetest.h標頭檔案,看第二行,呼叫了 jni.h,這個標頭檔案需要我們自己新增,為了j**a_home/include目錄下,新增方式和第②步一樣
/* do not edit this file - it is machine generated */
#include
/* header for class com_tao_test_nativetest */
#ifndef _included_com_tao_test_nativetest
#define _included_com_tao_test_nativetest
然後把上面的第二行的 #include 改為#include 「jni.h「。讓它去呼叫我們自己的標頭檔案,而不是系統的標頭檔案。
開啟jni.h,我們可以找打這麼一行
1.#include "jni_md.h"
這個標頭檔案也要我們自己新增,它位於j**a_home/include/win32目錄中,新增方式和前面一致。
④、編寫原始檔。
新建乙個原始檔,命名為nativemethod
然後,在裡面新增下面**:
#include "com_tao_test_nativetest.h" //引入標頭檔案
#include
using namespace std;
jniexport void jnicall j**a_com_tao_test_nativetest_sayhello //本地方法的實現
(jnienv * env, jobject obj)
public native void sayhello();
public static void 程式設計客棧main(string args)
}注意:
1、一般在static**塊中載入動態鏈結庫
2、如果將dll路徑加入path環境變數的時候,eclipse是開著的,那麼要關閉eclipse再開,讓eclipse重新讀取環境變數
3、必須在本類中使用native方法
下圖表示了我們編寫jni的過程
總結本文標題: 較詳細的jni簡介
本文位址: /ruanjian/j**a/207256.html
IO復用 較詳細
程序與執行緒的描述 乙個程序至少會建立乙個執行緒,多個執行緒共享乙個程式程序的記憶體。程式的執行最終是靠執行緒來完成操作的。執行緒的數量跟cpu核數有關,乙個核最多能發出兩個執行緒。執行緒的操作主要分為 一 給cpu進行程式命令的執行。二 io的操作 讀取或輸出資料 或者請求網路資料。io復用形成原...
jni之jni與jna的比較
j a開發過程中會遇到需要呼叫c c 動態庫 windows平台的dll和linux平台的so 的情況,可以使用jni或者jna技術。jna基於jni技術開發,主要在上層作了型別自動轉換的封裝,讓開發人員極易使用,無需jni那樣的繁雜的介面層開發。但是,jni的呼叫效率要比jna高得多,如果乙個操作...
DNS網域名稱解析過程 較詳細版
在網際網路世界你要去訪問其他主機時,你總得知道那台主機的位址吧?這時人們就發明了ip位址,每個ip位址與一台主機一一對應,通過ip位址就可以精確找到你需要訪問的主機了,ip位址是使用4個0 255的數進行表示的,比如最常用的127.0.0.1就代表主機的位址。顯然這並不好記,為此就出現了網域名稱,用...