建環境
1.下載jre與jdk1.下載eclipse & eclipse CDT
2. 解壓縮eclipse與eclipse CDT並將eclipse CDT中的plugins與features copy到eclipse中
創建JNI流程
產生 JNI *.h檔
1.打開eclipse 建立一個Java project
public class HelloJNI
{
static {
System.loadLibrary("libHelloJNI");
}
private native void sayHello();
}
- 點HelloJNI project 按右鍵,選New->Other,再選 C/C++, Convert to a C/C++ Project (Adds C/C++ Nature)->Next.
- 當"Convert to a C/C++ Project" 視窗跳出來後.在 "Project type", 中選 "Makefile Project" ,在 "Toolchains", 中選 "Linux GCC",然後點擊 Finish.
- 在project裡增加一個資料夾"jni"在jni中增加一個檔案makefile 內容如下
# Define a variable for classpath CLASS_PATH = ../bin # Define a virtual path for .class in the bin directory vpath %.class $(CLASS_PATH) # $* matches the target filename without the extension HelloJNI.h : HelloJNI.class javah -classpath $(CLASS_PATH) $*
4. 選makefile 點擊右鍵選 Make Targets->Create...然後跳出一個對話框
5. 接下來執行makefile->Make Targets->Build 跳出對話框後選擇HelloJNI.h然後按Build將會在jni資料夾中產生HelloJNI.h。
產生Share library *.so
1 .在eclipse創建一個c project "HelloJNI",Project type選Shared Library,
Toolchains選linux GCC 按finish
2. 將步驟5產生的HelloJNI.h 複製到HelloJNI這個project然後實作HelloJNI裡宣告的函數
1.Fatal error : jni.h : No such file or directory
解法:選擇Project->Property->C/C++ General ->Paths and Symbols->include
Languages->GUN C 再按 Add 將JAVA_HOME裡的include以及include/linux加入 然後按ok再編譯一次。
2.Description Resource Path Location Type ./main.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC HelloJNI
解法:選擇project->Property->C/C++ Build->GCC Compileer->Miscellaneous勾選(-fPic)
3.*** no rule to make target all'. stop
解法:
1.網路上有人的作法是Project->Property->C/C++ Build->Behavior->Build(incremental build) Text edit中的all清除。
2.但我的情況是被其他專案干擾只要將干擾的專案關掉即可。
4.接下來在Release/Debug資料夾將產生libHelloJNI.so檔
Toolchains選linux GCC 按finish
2. 將步驟5產生的HelloJNI.h 複製到HelloJNI這個project然後實作HelloJNI裡宣告的函數
#include <jni.h> #include <stdio.h> #include "HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) { printf("Hello World!\n"); return; }3. 然build all一次,會出現一些 error
1.Fatal error : jni.h : No such file or directory
解法:選擇Project->Property->C/C++ General ->Paths and Symbols->include
Languages->GUN C 再按 Add 將JAVA_HOME裡的include以及include/linux加入 然後按ok再編譯一次。
2.Description Resource Path Location Type ./main.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC HelloJNI
解法:選擇project->Property->C/C++ Build->GCC Compileer->Miscellaneous勾選(-fPic)
3.*** no rule to make target all'. stop
解法:
1.網路上有人的作法是Project->Property->C/C++ Build->Behavior->Build(incremental build) Text edit中的all清除。
2.但我的情況是被其他專案干擾只要將干擾的專案關掉即可。
4.接下來在Release/Debug資料夾將產生libHelloJNI.so檔
將JNI加入JAVA的專案裡
- 將HelloJNI.java加到測試專案TestJNI裡
TestJNI.java程式碼:
public class TestJNI { public static void main(String[] args) { // TODO Auto-generated method stub new HelloJNI().sayHello(); } }
2. 在專案裡增加一個資料夾jni再將libHelloJNI.so放入jni資料裡
3. 直接執行會發生錯誤
Exception in thread "main" java.lang. UnsatisfiedLinkError: no libHelloJNI in java.library.path
原因是找不到libHelloJNI.so檔
解法: 1.設定好 eclipse JAVA Build Path 2.在程式碼中使用System.load(System.getProperty(java.class.path)+"/"+libHelloJNI.so); 來代替System.loadLibrary("libHelloJNI");即可
public class TestJNI { public static void main(String[] args) { // TODO Auto-generated method stub new HelloJNI().sayHello(); } }
2. 在專案裡增加一個資料夾jni再將libHelloJNI.so放入jni資料裡
3. 直接執行會發生錯誤
Exception in thread "main" java.lang.
原因是找不到libHelloJNI.so檔
解法: 1.設定好 eclipse JAVA Build Path 2.在程式碼中使用System.load(System.getProperty(java.class.path)+"/"+libHelloJNI.so); 來代替System.loadLibrary("libHelloJNI");即可
參考:
http://www.bogotobogo.com/cplusplus/eclipse_CDT_JNI_MinGW_64bit.php
http://www.bogotobogo.com/cplusplus/eclipse_CDT_JNI_MinGW_64bit.php
無法 makefile:9: *** missing separator. Stop.
回覆刪除makefile:9: *** missing separator. Stop.
回覆刪除makefile:9: *** missing separator. Stop.
回覆刪除