2015年2月12日 星期四

在Ubuntu 14.04使用eclipse創建JNI流程

建環境

1.下載jre與jdk
1.下載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();
}
  1. HelloJNI project 按右鍵,選New->Other,再選 C/C++, Convert to a C/C++ Project (Adds C/C++ Nature)->Next.
  2. 當"Convert to a C/C++ Project" 視窗跳出來後.在 "Project type", 中選 "Makefile Project" ,在 "Toolchains", 中選 "Linux GCC",然後點擊 Finish. 
  3. 在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...然後跳出一個對話框

     CreateMakeTarget_hello_jni_h.png
   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裡宣告的函數
#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的專案裡

  1. 將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");即可

參考:
http://www.bogotobogo.com/cplusplus/eclipse_CDT_JNI_MinGW_64bit.php


         






3 則留言: