詳解Java中native症結字。本站提示廣大學習愛好者:(詳解Java中native症結字)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中native症結字正文
一. 甚麼是Native Method
簡略地講,一個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法式可以做任何運用條理的義務。
2、應用辦法
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的書寫步調以下:
以下是一個在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症結字的具體引見,願望對年夜家的進修有所贊助。