較詳細的JNI簡介

2022-10-07 11:57:06 字數 3003 閱讀 7760

在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就代表主機的位址。顯然這並不好記,為此就出現了網域名稱,用...