在Android應用的開發project中。無論是游戲還是普通應用。都時常會用到.so即動態鏈接庫,關於.so是什么玩意兒,有什么優點。這個大家能夠在網上查一下,本人不做過多解釋。
.so本是linux下的文件類型,所以編譯.so必需要在linux環境下,那么怎樣在win下進行編譯呢?隨便在網上搜下,教程也是五花八門,不清不楚,沒有一定功底,即便看着教程到最后預計還是功敗垂成,更別說剛開始學習的人,看了保證頭暈眼花,本人也是依據網上的一些樣例。總結了一個個人覺得還算比較簡單的一個.so的編譯方法:GNUstep(網上有不少用cygwin的。大家也能夠去研究下)。
進入正題。win下.so開發環境搭建:(因為資源在網上不太好找,於是本人將須要的工具都放進了網盤)
1.NDK(本NDK版本號為10):鏈接: http://pan.baidu.com/s/1bn1xDQB password: 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 password: kuuj
下載並安裝完成后(安裝路徑默認就可以):
首先。在eclipse中導入NDK所在路徑(解壓完成后的路徑)
然后。在c盤(本人的安裝路徑在c盤),找到文件GNUstep.conf並打開以配置環境變量:
在該文件最后兩行加入或改動:(注意你NDK的路徑)
NDK=E:/baiyuliang/android-ndk-r10 export=NDK打開GNUstep,並輸入make -v,確定(enter鍵),再輸入gcc -v。出現例如以下圖症狀:
輸入cd $NDK,出現又出現下圖症狀:
則表示開發環境已搭建成功!
好了。接下來我們做一個簡單的樣例以學習怎樣使用GNUstep來做NDK的開發:
在eclipse中創建一個項目project,包名:com.byl.testjni,主類名MainActivity(這個要看清楚,接下來會要求你正確輸入他們的路徑和名稱):
創建完成后,打開cmd,輸入javah命令執行:
出現如圖顯示,則表示一切順利,可繼續往下進行,假設出現找不到該命令,則要檢查下你的jdk環境變量是否配置正確。
接下來。定位到該project項目中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/TestJni2.輸入命令,生成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:這個樣例非常easy。就是打印一字符串,跟實際應用開發中所要編寫的復雜的方法等相錯甚遠,所以真正學會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