1. 程式人生 > 其它 >Java native 關鍵字簡單案例(Mac)

Java native 關鍵字簡單案例(Mac)

java native關鍵字:允許開發者通過呼叫c/c++的程式滿足自己的開發需求。

在java中宣告一個native方法,但不通過java實現,而是用c/c++實現這個方法。

在java中通過呼叫c/c++生成的動態連結庫,從而達到自己的開發需求。

java本身也有許多native方法(比如StrictMath.java中),也是通過c/c++實現StrictMath.java中的方法,在jvm中呼叫並返回結果實現的。

流程說明在NativeTest.java中

檔案目錄結構:

  • src
    • jni.h
    • jni_md.h
    • libhello.jnilib
    • NativeTest.java
    • /**
       * 步驟:
       * 1. 編寫一個java檔案,比如:NativeTest.java,其中包含native方法
       * 2. 使用 javac NativeTest.java 命令生成class檔案
       * 3. 使用 javah -classpath . -jni Java.NativeTest(全限定名稱) 命令生成 Java_NativeTest.h 檔案
       * 4. 檢視 Java_NativeTest.h 檔案中的方法
       * 5. 編寫 NativeTestImpl.c 檔案,並實現其中的方法
       * 6. 將 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/jni.h
       *      /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/darwin/jni_md.h
       *      複製到src目錄下
       *    sudo cp jni.h ~/WorkSpace/study/src
       *    sudo cp ./darwin/jni_md.h ~/WorkSpace/study/src
       * 7. 使用如下命令生成動態連結庫
       *    gcc -dynamiclib NativeTestImpl.c -o libhello.jnilib
       *    在mac下,.jnilib 是固定的,名字必須要以 lib 開頭,在呼叫的時候,必須吧 lib 省略,只需要寫 hello
       * 8. 執行java程式,呼叫 native 方法
       *    使用命令 java NativeTest
       *
       * 可能遇到的問題:
       * 問題一:
       * ./Java_NativeTest.h:2:10: error: 'jni.h' file not found with <angled> include; use "quotes" instead
       * #include <jni.h>
       * 解決方法:
       * 將 Java_NativeTest.h 中 #include <jni.h> 改為 #include "jni.h"
       *
       
      */ public class NativeTest { public native void hello(); static{ //設定查詢路徑為當前專案路徑 System.setProperty("java.library.path", "."); //載入動態庫的名稱 System.loadLibrary("hello"); } public static void main(String[] args) { new NativeTest().hello(); } }
      NativeTest.java
    • NativeTest.h
    • /* DO NOT EDIT THIS FILE - it is machine generated */
      #include "jni.h"
      /* Header for class NativeTest */
      
      #ifndef _Included_NativeTest
      #define _Included_NativeTest
      #ifdef __cplusplus
      extern "C" {
      #endif
      /*
       * Class:     NativeTest
       * Method:    hello
       * Signature: ()V
       */
      JNIEXPORT void JNICALL Java_NativeTest_hello
        (JNIEnv 
      *, jobject); #ifdef __cplusplus } #endif #endif
      NativeTest.h
    • NativeTestImpl.c
    • #include "jni.h"
      #include "NativeTest.h"
      #include <stdio.h>
      
      JNIEXPORT void JNICALL Java_NativeTest_hello(JNIEnv *env, jobject obj){
          printf("NaviteTest hello world!\n");
          return ;
      }
      NativeTestImpl.c