首先確定已經存在 .c 檔(這裡以 hello-jni 為範例,在預設的情況下,已經存在/project_root_path/jni/hello-jni.c。
Step 1.打開Terminal並移動到專案根目錄的 jni 資料夾(/project_root_path/jni/)。
Step 2.編譯 .o 檔
輸入
gcc -Wall -fPIC -c hello-jni.c -I /usr/lib/jvm/java-7-oracle/include/linux/ -I /usr/lib/jvm/java-7-oracle/include/
Note:
-Wall:產生所有警告訊息。
-fPIC:表示編譯後為位置獨立的代碼。
-c:產生.o檔案。
hello-jni.c:代表要編譯的檔案,若有多個檔案必須使用空格分開,也可以指定路徑。
-I /path_of_directory:指定額外.h檔的搜索路徑(/path_of_directory),這是用在編譯的檔案(.c)中出現
#include “file” 的時候 , gcc/g++會在目前目錄尋找.h檔,如果沒有找到,會回到預設的.h目錄尋找,如果使用-I指定目錄,gcc 會從指定的目錄尋找,然後順著一般的順序。
因為hello-jni.c 有 #include <jni.h>,jni.h的位置即為 /usr/lib/jvm/java-7-oracle/include/
編譯完成後會產生 hello-jni.o 檔案
Step 3.編譯 .so 檔
輸入
gcc -Wall -rdynamic -shared -o libhello-jni.so hello-jni.o
完成後會產生 libhello-jni.so 檔
以上 Step 2 和 Step 3 可以使用一句指令完成,省去了產生.o檔的步驟,e.g.
gcc hello-jni.c -fPIC -shared -I /usr/lib/jvm/java-7-oracle/include/linux/ -I /usr/lib/jvm/java-7-oracle/include/ -lm -o libhello-jni.so