linux下JNI開發—HelloWord為例
阿新 • • 發佈:2018-11-08
轉自:https://www.cnblogs.com/snake-hand/archive/2012/05/25/2517412.html
前期準備:
1、Java JDK
2、gcc
3、g++
確保上述準備工作完成後開始下邊的工作:
Java程式碼:
public class Hello { static { try { System.loadLibrary("HelloWord" ); } catch (UnsatisfiedLinkError e) { e.printStackTrace(); } } public Hello() {}; public native void SayHello(String strName); }
在終端輸入 javac Hello.java 後生成Hello.class 檔案
然後:javah Hello 生成 Hello.h檔案
然後在相同的目錄下新建一個Hello.cpp檔案:內容如下:
#include "Hello.h" #include <stdio.h> // 與 Hello.h 中函式宣告相同 JNIEXPORT void JNICALL Java_Hello_SayHello (JNIEnv * env, jobject arg, jstring instring) { // 從 instring 字串取得指向字串 UTF 編碼的指標 const jbyte *str = (const jbyte *)env->GetStringUTFChars( instring, JNI_FALSE ); printf("Hello,%s\n" ,str); // 通知虛擬機器原生代碼不再需要通過 str 訪問 Java 字串。 env->ReleaseStringUTFChars( instring, (const char *)str ); return ; }
編譯生成動態庫
gcc -I /usr/java/jdk1.8.0_73/include/ -I /usr/java/jdk1.8.0_73/include/linux/ Hello.cpp -fPIC -shared -o Hello.so
注意
/usr/java/jdk1.8.0_73/include/
/usr/java/jdk1.8.0_73/include/linux/
這兩目錄根據自己的java jdk的安裝目錄而變。
所有檔案
Hello.class Hello.cpp Hello.h Hello.java Hello.so
最後通知動態連結程式此共享檔案的路徑。
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
最後是java測試程式碼:
public class ToSay { public static void main(String argv[]) { ToSay say = new ToSay(); } public ToSay() { Hello h = new Hello(); // 呼叫本地方法向 John 問好 h.SayHello("John" ); } }
用 javac 編譯 ToSay.java,生成 ToSay.class
向執行普通 Java 程式一樣使用 java ToSay,我們會看到在螢幕上出現 Hello,John。