前面對LINUX下打SO庫進行了介紹。
這一章,將對WIN平台上編譯C++打包SO庫進行介紹,其實這個和LINUX下一樣的操作,為什麼要對WIN平台的介紹,是因為我在WIN平台打包碰到了問題,其次是我未使用過LINUX系統,習慣了WIN平台。好,不說廢話了。
WIN32平台:
準備工作(版本可自選):
XP + JDK1.6
cygwin 最新版裝:ubunit,g++,gcc,gdb (其中g++,gcc已升到4.5.3版,預設裝好的是3.4.4)
swig :2.0.4
其中的.h和.cpp及.i檔案請見上集中的interfacecar.h和interfacecar.cpp和cplus.i檔案。
將以上檔案放到同一個目錄下,這個目錄最好不要使用帶空格的及中文的路徑目錄。如果有中文的可以使用subst來進行映射成其它盤符(嘿嘿通常我都這麼搞)。
或都使用\來將空格進行轉議如/cygdrive/c/program\ files/.... 中間的空格就使用\來轉議
準備工作OK。
1、使用SWIG將.i檔案編譯為JAVA檔案。(我的檔案路徑:f:\so\socplus)
[如果未設定環境變數的,必須先cd進入到swig目錄]
swig -c++ -java f:\so\socplus\cplus.i
將產生.java和xxx_wrap.cxx檔案
有了xxxx_wrap.cxx檔案,就可以打SO庫了。
2、先把.cpp和cxx檔案編譯為.o檔案。
先cd進入到相應的目錄,注cygwin的目錄需要使用/cygdrive/進行映射
g++ -Wall -c interfacecar.cpp cplus_wrap.cxx
說明:
這命令是不是像LINUX下的呀,有些人對比了一下,怎麼沒有串連jni.h和jni_md.h標頭檔啊。原因是因為我的JDK裝在了D:\program files\java下了,大家注意這個program files這個目錄中有一個空格如果使用-I/cygdrive/d/program files/java/...時會提示找不到files/java/....明白為什麼不用空格路徑的原因了吧。嘿嘿,不要緊張,還是有解決辦法的。到Cygwin目錄搜一下jni.h和jni_md.h,把你的JDK中的jni.h和jni_md.h考過來替換即可解決(為什麼要替換是因為我的Swig 匯出的xxx_wrap.cxx用的是JDK1.6而我的cygwin中內建的jni不是這個版本的,所以衝突)。
找不到jni或版本不對的jni.h時,報錯:
編譯後產生兩個.o檔案;
3、將.o檔案打包為so庫檔案。
g++ -shared -fpic interfacecar.o cplus_wrap.o -o libcp.so
這個跟LINUX命令沒有什麼區別,一樣的。
OK,打包完成。
以上為WIN平台打包完成。
測試:
將.so和.JAVA檔案全部丟到LINUX平台下進行測試。(好像也可以將JAVA檔案編譯為CLASS檔案打個Jar,jar cvf xxx.jar *.class)這個JAVA的自行研究了。
有幾個錯:
java.lang.UnstaisfiedLinkError:no cp in java.library.path
這是找不到libcp.so這個庫。我只知道放到/usr/lib下可以找到,當然對eclipse的高手可以設定搜尋路徑到libcp.so對應的路徑下也一樣可以找到。
由於打包版本和運行版本不對導致
由於我的WIN平台和虛擬機器LINUX平台上的JDK不同,所以一直都沒有測試成功。請讀者自行驗證了。
最後:總結幾點。
打包時一定要注意使用的JDK,版本。運行環境版本要與打包版本一至,不然載入就會失敗。(個人理解的,未得到驗證)
其次,就是路徑,環境變數需要設定好,否則就出現找不到庫等問題。
再次,如果是打C++的SO庫,在類型上都需要做一些必要的轉換。這個只是個初步介紹,在實際項目中,會碰到各種問題,哪時再自行GOOGLE了。
OK,完畢。