標籤:ndk
在Android應用的開發工程中,不管是遊戲還是普通應用,都時常會用到.so即動態連結程式庫,關於.so是什麼玩意兒,有什麼好處,這個大家可以在網上查一下,本人不做過多解釋。.so本是linux下的檔案類型,所以編譯.so必須要在linux環境下,那麼如何在win下進行編譯呢?隨便在網上搜下,教程也是五花八門,不清不楚,沒有一定功底,即便看著教程到最後估計還是功敗垂成,更別說初學者,看了保證頭暈眼花,本人也是根據網上的一些例子,總結了一個個人認為還算比較簡單的一個.so的編譯方法:GNUstep(網上有不少用cygwin的,大家也可以去研究下)。
進入正題,win下.so開發環境搭建:(由於資源在網上不太好找,於是本人將需要的工具都放進了網盤)
1.NDK(本NDK版本為10):連結: http://pan.baidu.com/s/1bn1xDQB 密碼: lr7d
2.gnustep-core-0.34.0-setup.exe,gnustep-devel-1.4.0-setup.exe,gnustep-msys-system-0.30.0-setup.exe 連結: http://pan.baidu.com/s/1ntLwd53 密碼: kuuj
下載並安裝完畢後(安裝路徑預設即可):
首先,在eclipse中匯入NDK所在路徑(解壓完畢後的路徑)
然後,在c盤(本人的安裝路徑在c盤),找到檔案GNUstep.conf並開啟以配置環境變數:
在該檔案最後兩行添加或修改:(注意你NDK的路徑)
NDK=E:/baiyuliang/android-ndk-r10export=NDK
開啟GNUstep,並輸入make -v,確定(enter鍵),再輸入gcc -v,出現如癥狀:
輸入cd $NDK,出現又出現癥狀:
則表示開發環境已搭建成功!
好了,接下來我們做一個簡單的例子以學習如何使用GNUstep來做NDK的開發:
在eclipse中建立一個項目工程,包名:com.byl.testjni,主類名MainActivity(這個要看清楚,接下來會要求你正確輸入他們的路徑和名稱):
建立完畢後,開啟cmd,輸入javah命令運行:
出現顯示,則表示一切順利,可繼續往下進行,如果出現找不到該命令,則要檢查下你的jdk環境變數是否配置正確。
接下來,定位到該工程項目中src檔案夾硬碟中的所在路徑:
開啟項目中的MainActivity,加入以下代碼:
public native String hello();//定義.so中的方法名 static{ System.loadLibrary("testJni");//定義產生的.so的名稱 }
這個是需要事先寫在調用.so的Activity中的,在編譯時間會自動在標頭檔中組建定義的方法名,以及最後產生的.so名稱,接下來在cmd中輸入以下命令,產生c頭檔案:
javah -d ../jni com.byl.testjni.MainActivity
千萬注意路徑不要寫錯,確定後,如果什麼都沒提示,則表示執行成功,eclipse中右鍵-重新整理項目:
然後在jni檔案夾中建立一個c檔案,名稱為與.so名稱一致,即testJni.c:
接下來,仍在jni檔案夾中編寫Android.mk檔案,Android.mk檔案可在NDK安裝路徑下的samples/hello-jni/jni中找到,直接複製過來:
開啟Android.mk,並修改其中的LOCAL_MODULE和LOCAL_SRC_FILES:
LOCAL_MODULE是描述模組的,用來給java調用的模組名,會產生對應的libtestJni.so;
LOCAL_SRC_FILES是源檔案,多個檔案空格隔開即可;
關鍵的一步來了,開啟GNUstep,開始編譯並產生.so檔案:
1.輸入命令,定位到項目(TestJni)所在位置:
cd /E/AndroidProject/TestJni
2.輸入命令,產生testJni.so檔案:
$NDK/ndk-build
,則表示運行成功,重新整理項目,看libs下testJni.so檔案是不是已經靜靜的躺在那裡了?(注意:產生的檔案預設前面會加一個lib即libtestJni.so)
下面就是見證奇蹟的時刻:
開啟MainActivity,在Oncreate方法中,調用hello()方法並列印,如果顯示”HelloJni!“即表示.so產生無誤並且調用成功!
Log.e("jj", hello());
運行,看LogCat:
OK!完美運行!
此後,就可以把一些重要的變數,或者服務地址什麼的放在.so裡面了,然後將產生的.so放進項目就可以使用啦!
PS:這個例子很簡單,就是列印一字串,跟實際應用開發中所要編寫的複雜的方法等相錯甚遠,所以真正學會NDK開發還需要下苦功夫的!
注意事項:
有童鞋可能用這個例子上產生的.so直接放在其它項目上使用時出現調用方法不成功的問題,在這裡告訴大家一下,編譯.so時所使用的Activity路徑一定要與項目中調用.so中方法的Activity路勁一致,比如:A項目中的AActivity要調用一個.so,那麼可以直接在本項目中產生.so,如果另建立一個單獨的項目如B項目去產生.so時,那麼B項目中Activity路徑要與A完全一樣:
A項目:com.byl.testjni.AActivity,
那麼B項目也必須為:com.byl.testjni.AActivity
demo源碼:http://download.csdn.net/detail/baiyuliang2013/8505977
NDK在windows下的開發環境搭建及開發過程