Java 基礎:認識&理解關鍵字 native 實戰篇

來源:互聯網
上載者:User

標籤:

Writer:BYSocket(泥沙磚瓦漿木匠)

微博:BYSocket

豆瓣:BYSocket

    泥瓦匠初次遇見 navicat 是在 java.lang.Object 源碼中的一個hashCode方法:

1 public native int hashCode();

    為什麼有個navicat呢?這是我所要學習的地方。所以今天泥瓦匠想要總結下navicat。

一、認識 native 即 JNI,Java Native Interface

    凡是一種語言,都希望是純。比如解決某一個方案都喜歡就單單這個語言來寫即可。Java平台有個使用者和本地C代碼進行互操作的API,稱為Java Native Interface (Java本地介面)。

二、用 Java 調用 C 的“Hello,JNI”

    我們需要按照下班方便的步驟進行:

   1、建立一個Java類,裡麵包含著一個 native 的方法和載入庫的方法 loadLibrary。HelloNative.java 代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class HelloNative {      static      {          System.loadLibrary("HelloNative");      }            public static native void sayHello();            @SuppressWarnings("static-access")      public static void main(String[] args)      {          new HelloNative().sayHello();      } }

     首先泥瓦匠讓大家注意的是native方法,那個載入庫的到後面也起作用。native 關鍵字告訴編譯器(其實是JVM)調用的是該方法在外部定義,這裡指的是C。如果大家直接運行這個代碼,  JVM會告之:“A Java Exception has occurred.”控制台輸出如下:

1 2 3 4 5 Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path      at java.lang.ClassLoader.loadLibrary(Unknown Source)      at java.lang.Runtime.loadLibrary0(Unknown Source)      at java.lang.System.loadLibrary(Unknown Source)      at HelloNative.< clinit >(HelloNative.java:5)

    這是程式使用它的時候,虛擬機器說不知道如何找到sayHello。下面既可以手動寫,自然泥瓦匠是用

    2、運行javah,得到包含該方法的C聲明標頭檔.h

    泥瓦匠將HelloNative.java ,簡單地 javac javah,

    就得到了下面的 HelloNative.h檔案 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* DO NOT EDIT THIS FILE - it is machine generated */ #include < jni.h > /* Header for class HelloNative */   #ifndef _Included_HelloNative #define _Included_HelloNative #ifdef __cplusplus extern "C" { #endif /*   * Class:     HelloNative   * Method:    sayHello   * Signature: ()V   */ JNIEXPORT void JNICALL Java_HelloNative_sayHello    (JNIEnv *, jclass);   #ifdef __cplusplus } #endif #endif

    jni.h 這個檔案,在/%JAVA_HOME%include

    3、根據標頭檔,寫C實現本地方法

    這裡我們簡單地實現這個sayHello方法如下:

1 2 3 4 5 6 7 #include "HelloNative.h" #include < stdio.h >   JNIEXPORT void JNICALL Java_HelloNative_sayHello {      printf("Hello,JNI");    }

   4、產生dll共用庫,然後Java程式load庫,調用即可。

   在Windows上,MinGW GCC 運行如下

1 gcc -m64  -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.7.0_71\include" -I"C:\Program Files\Java\jdk1.7.0_71\include\include\win32" -shared -o HelloNative.dll HelloNative.c

   -m64表示產生dll庫是64位的。然後運行 HelloNative:

1 java HelloNative

  

   終於成功地可以看到控制台列印如下:

1 Hello,JNI
三、JNI 調用 C 流程圖

 

Writer:BYSocket(泥沙磚瓦漿木匠)

微博:BYSocket

豆瓣:BYSocket

Java 基礎:認識&理解關鍵字 native 實戰篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.