Java native 關鍵字簡單案例(Mac)
阿新 • • 發佈:2021-06-24
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" *
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
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