Java Native方法
簡單地講,一個Native Method就是一個java呼叫非java程式碼的介面。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特徵並非java所特有,很多其它的程式語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去呼叫一個C的函式。
"A native method is a Java method whose implementation is provided by non-java code."
在定義一個native method時,並不提供實現體(有些像定義一個java interface),因為其實現體是由非java語言在外面實現的。,下面給了一個示例:
package java.lang; public class Object { ...... public final native Class<?> getClass(); public native int hashCode(); protected native Object clone() throws CloneNotSupportedException; public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException; ...... }
識別符號native可以與所有其它的java識別符號連用,但是abstract除外。這是合理的,因為native暗示這些方法是有實現體的,只不過這些實現體是非java的,但是abstract卻顯然的指明這些方法無實現體。native與其它java識別符號連用時,其意義同非Native Method並無差別。
一個native method方法可以返回任何java型別,包括非基本型別,而且同樣可以進行異常控制。這些方法的實現體可以自制一個異常並且將其丟擲,這一點與java的方法非常相似。
native method的存在並不會對其他類呼叫這些本地方法產生任何影響,實際上呼叫這些方法的其他類甚至不知道它所呼叫的是一個本地方法。JVM將控制呼叫本地方法的所有細節。
如果一個含有本地方法的類被繼承,子類會繼承這個本地方法並且可以用java語言重寫這個方法(這個似乎看起來有些奇怪),同樣的如果一個本地方法被fianl標識,它被繼承後不能被重寫。
本地方法非常有用,因為它有效地擴充了jvm.事實上,我們所寫的java程式碼已經用到了本地方法,在sun的java的併發(多執行緒)的機制實現中,許多與作業系統的接觸點都用到了本地方法,這使得java程式能夠超越java執行時的界限。有了本地方法,java程式可以做任何應用層次的任務。
二、使用方法
native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前檔案,而是在用其他語言(如C和C++)實現的檔案中。Java語言本身不能對作業系統底層進行訪問和操作,但是可以通過JNI介面呼叫其他語言來實現對底層的訪問。
JNI是Java本機介面(Java Native Interface),是一個本機程式設計介面,它是Java軟體開發工具箱(Java Software Development Kit,SDK)的一部分。JNI允許Java程式碼使用以其他語言編寫的程式碼和程式碼庫。Invocation API(JNI的一部分)可以用來將Java虛擬機器(JVM)嵌入到本機應用程式中,從而允許程式設計師從本機程式碼內部呼叫Java程式碼。
不過,對Java外部的呼叫通常不能移植到其他平臺,在applet中還可能引發安全異常。實現原生代碼將使您的Java應用程式無法通過100%純Java測試。但是,如果必須執行本地呼叫,則要考慮幾個準則:
1.將您的所有本地方法都封裝到一個類中,這個類呼叫單個的DLL。對每一種目標作業系統平臺,都可以用特定於適當平臺的版本的DLL。這樣可以將原生代碼的影響減少到最小,並有助於將以後所需要的移植問題考慮在內。
2.本地方法儘量簡單。儘量使您的本地方法對第三方(包括Microsoft)執行時DLL的依賴減少到最小。使您的本地方法儘量獨立,以將載入您的DLL和應用程式所需的開銷減少到最小。如果需要執行時DLL,必須隨應用程式一起提供。
JNI的書寫步驟如下:
- a.編寫帶有native宣告的方法的Java類
- b.使用javac命令編譯編寫的Java類
- c.使用java -jni ****來生成字尾名為.h的標頭檔案
- d.使用其他語言(C、C++)實現本地方法
- e.將本地方法編寫的檔案生成動態連結庫
以下是一個在Java中呼叫本地C程式的簡單的例子:
a.編寫HelloWorld.java類
class HelloWorld{
public native void hello();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().hello();
}
}
b.編譯
javac HelloWorld.java
c.生成.h檔案
javah -jni HelloWorld
生成內容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
第一個引數是呼叫JNI方法時使用的JNI Environment指標。第二個引數是指向在此Java程式碼中例項化的Java物件HelloWorld的一個控制代碼。其他引數是方法本身的引數
d.c實現
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World!\n");
return;
}
其中,第一行是將jni.h檔案引入(在%JAVA_HOME%\include目錄下),裡邊有JNIEnv和jobject的定義。
e.編譯c實現
這裡以在Windows中為例,需要生成dll檔案。在儲存HelloWorldImpl.c資料夾下面,使用VC的編譯器cl成。
cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
注意:生成的dll檔名在選項-Fe後面配置,這裡是hello,因為在HelloWorld.java檔案中我們loadLibary的時候使用的名字是hello。當然這裡修改之後那裡也需要修改。另外需要將-I%java_home%\include -I%java_home%\include\win32引數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h檔案。
f.執行程式
java HelloWorld就ok了!
相關推薦
java native方法使用及JNI例項
1.參考文獻: http://blog.csdn.net/youjianbo_han_87/article/details/2586375 http://blog.csdn.net/yangjiali014/article/details/1633017 http://blog.
Java Native方法
一. 什麼是Native Method 簡單地講,一個Native Method就是一個java呼叫非java程式碼的介面。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特徵並非java所特有,很多其它的程式語言都
java native方法及JNI例項
1、native關鍵字用法 常見的Object類的很多方法都是用native修飾。 native是與C++聯合開發的時候用的!使用native關鍵字說明這個方法是原生函式,也就是這個方法是用C/C++語言實現的,並且被編譯成了DLL,由java去呼叫。
Java native方法String轉char*以及String[]轉char**
JNIEXPORT void JNICALL Java_swap_swap_1float (JNIEnv *env, jclass cla, jstring in, jstring out)
Dalvik虛擬機器中Java native方法的呼叫過程
我們知道,Java native方法的註冊形式有兩種,一種是主動註冊,一種是預設的被動註冊,如果我們希望弄清楚java native方法的呼叫過程,我們首先就需要搞清楚兩種註冊方式的實現原理,下面我們先分別看看這兩種註冊方式。 一、Java native方法的主動註冊
java native interface JNI 調用Java方法
程序 color void size nature llb 方法調用 margin 處理 在上一篇文章中介紹了JNI。以及java調用JNI。這篇講一下 JNI調用java方法。 通過使用合適的JNI函數,你能夠創建Java對象,get、set 靜態(s
java中native方法的使用
cat 語言 pub jvm 配置 his fde 應用程序 nic native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前文件,而是在用其他語言(如C和C++)實現的文件中。Java語言本身不能對操作系統底層進行訪問和操作,但是可以通過JNI接口調用
<正則吃餃子> :關於Java的native方法(轉)
any 所有 接口 當我 article 正是 str 直接 空間 感謝作者的分享,原文地址:http://blog.csdn.net/wike163/article/details/6635321 一. 什麽是Native Method 簡單地講,一個Native
JVM執行native方法,計數器為空(undefined),又怎麽繼續執行Java代碼的問題?
執行 重新啟動 一句話 正在 哪裏 fin 獨立 調用 繼續 在Java的自動內存分配中,我們看到一句話: 如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是native方法,這個計數器值則是為空(undefined)
Java JDK原始碼解析之:native方法
初次看見native關鍵字是自己在看Scanner類原始碼中傳遞System.in引數實現列印,之後轉到System觀看原始碼時看見native關鍵字,關於native關鍵字筆者表示,是Java與C語言的通訊介面,因為Java語言沒有操作底層的條件,所以Java
Java基礎之native方法
什麼是native方法(本地方法) native方法就是java呼叫非java程式碼的介面。native方法是這樣一個java方法:該方法的實現由非java語言實現,比如C。 定義一個native方法,不提供方法體(類似於抽象方法)。因為其方法體是由非java語言在外面實現的。
java中的native方法
轉載地址:http://www.cnblogs.com/langtianya/p/3459647.html 一. 什麼是Native Method 簡單地講,一個Native Method就是一個java呼叫非java程式碼的介面。一個Native Method是這樣
Java中的native方法實現(Java混用C/C++)
前言 native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前檔案,而是在用其他語言(如C和C++)實現的檔案中。Java語言本身不能對作業系統底層進行訪問和操作,但是可以通過JNI介面呼叫其他語言來實現對底層的訪問。 JNI是Java本
Java編寫編譯native方法
我的環境是CentOS,linux系統。 #編譯帶有native方法的java程式,生成class檔案 javac writeFloat.java #javah -jni生成.h檔案javah -jn
JAVA中native方法呼叫C語言實現學習
在java虛擬機器規範的記憶體管理劃分中,對於虛擬機器記憶體空間劃分中專門劃了一塊記憶體叫做“本地方法棧(Native Method Stack)”。本地方法棧是為了java專門用來呼叫native方法而劃分出來的一塊記憶體。 我們平時在閱讀jdk原始碼
Java的native方法
1、什麼是native methodJava中呼叫非Java語言實現的介面。也就是說該方法的實現不是用Java程式碼寫的,而是用C、C++等其他語言寫的。2、如何定義native methodnative method可以和Java中的關鍵字聯合使用:static、synch
Mac下Java的native方法以及JNI呼叫C語言
1.native方法 最近在讀JDK NIO的原始碼的時候發現了很多的native方法,這些方法都只給出了native修飾的定義,並沒有給出實現體,並且也沒有實現體,形式上和介面很類似。但是這些其實是特定的native方法,那麼什麼是native方法呢?下面給
Java靜態方法 與 非靜態方法(實例方法)的區別
外部類 允許 靜態成員 靜態 成員 訪問 靜態成員變量 ava 實例方法 靜態方法與實例方法的異同 1.在外部類 調用靜態方法時,有兩種方式:(1)類名.靜態方法()(2)類的對象.靜態方法() ;也就是說調用靜態方法時可以不用創建對象。 調用實例
Java Split()方法按點(.)切分註意細節
absolut int abs println clip nts image content con 按點(.)切分,必須要註意轉義!如:split("\\.")。 例子: [java] view plain copy print? public clas
java static 方法與普通方法區別
對象 static 方法區 修改 需要 總結 資源 其他 一個 static 方法不需要實例化,靜態方法在JVM剛加載的時候就編譯過了.在程序的運行過程中隨時可以調用,不需要去實例化某個對象然後再去調用,可以直接用類名去調用,直到結束釋放內存,且靜態方法只能調用類靜態變量