cygwin+windows 使用JNI時 .c文件打包成.so

寫一個JNI Test.html

一、java中聲明 native func
二、使用javah 將.class編譯獲得 .h
三、編寫.c
四、打包成.so 動態庫
五、JAVA中使用加載.so 而後就可使用native方法了。
 
其餘步驟問題不大,在打包上卡住了。
一個helloWorld打包的話,只須要
-------------------------------------
1: gcc -c helloWorld -o hello.o
2: gcc -shared libhello.so hello.o
------------------------------------
 
可是完成一個簡單的JNI程序,並能夠在JAVA中調用 遠不止這些。
只記錄須要注意的。
生成.o時
一、是JNI程序,因此 C文件中包含了 因此打包時要包含jni.h的目錄。jni.h是JDK中的文件。
如:加入選項(路徑指向jni根目錄和win32目錄)
-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include" 
-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include/win32" 
二、要加入   -D__int64="long long"   否則會報錯。"=".""之類的錯誤信息。
.o生成.so時 
一、假如選項   --kill-at,若是不加在java中使用.so文件時,可能會報找不到某方法。
       使用dllexp等動態庫查看器,能夠看到 沒使用選項時動態庫裏的方法名字是 testfunc@8 ,加了以後是 testfunc。 少了@符號。
二、使用cygwin生成出來可能須要 cygwin1.dll這個動態庫才能運行。
使用命令 ldd XXXX.so 能夠查看其依賴的庫,如個人
    ------------------------------------------------------
$ ldd libtest.so
        ntdll.dll => /cygdrive/c/WINDOWS/system32/ntdll.dll (0x7c920000)
        kernel32.dll => /cygdrive/c/WINDOWS/system32/kernel32.dll (0x7c800000)
          cygwin1.dll   => /cygdrive/f/workspace/TestJNI/libs/cygwin1.dll (0x61000000)
---------------------------------------------------------
這樣的話,使用java導入咱們本身的XXXX.so時,就必須先導入cygwin1.dll這個依賴庫。
或者 使用選型   -mno-cygwin (在生成.so時使用)但在cygwin下使用這個命令有個問題。
可能會出現
cc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler   錯誤
由於gcc4(暫時)不支持這個參數
只要運行   usr/bin/set-gcc-default-3.sh   將gcc運行的版本改成gcc-3便可。若是要變回來
usr/bin/set-gcc-default-4.sh
或者裝個MSYS使用mingw編譯
綜上所述,命令應該是
------------------------------------------------------
gcc -D__int64="long long" \
-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include" \
-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include/win32" \
-c -o test.o tun_test_JNI_C2JAVA.c
 
/usr/bin/set-gcc-default-3.sh 
 
cc -shared -o libtest.so -Wl,-soname,libtest.so,--kill-at test.o -mno-cygwin
-------------------------------------------------------
這樣就能夠生成出一個正確的.so文件了。
 
離在JAVA中正常使用,還差最後一步了。
在JAVA中導入動態連接庫,若是老是出現 
java.lang.UnsatisfiedLinkError: no XXXX in java.library.path 」 繼續往下看。

JAVA中使用動態連接庫須知 http://www.cnblogs.com/xifanyaoyao/p/3659002.html

相關文章
相關標籤/搜索