Android之JNI實踐一(環境搭建和簡單樣本)
申明:以下大部分步驟都是來自網路資料,由於某些網路資料的不全甚至錯誤問題,因此自己實踐後並整理一下整個流程,便於作為學習筆記,非常感謝網友!
意圖:做這個的意圖主要是因為目前準備遊戲2.0的版本開發,要用到引擎,而引擎是用c/c++實現的,目前正在準備移植該引擎,因此開始著手這方便的資料,之前一直做的是純android的遊戲,未考慮到!
下面開始一天的旅程【在開始這些之前,你應該有android開發的環境了】:
1. 首先安裝Cygwin,安裝的目的主要是jni的庫(.so)的產生需要cmake、gcc,所以利用Cygwin工具安裝這兩個編譯環境;
2. 安裝android-ndk-r5安裝包,去官網或者網上搜就可以下載,可以是其他比較新的版本;安裝方式直接解壓到特定目錄即可;
(NDK, Cygwin安裝包,也可以自己下載):http://pan.baidu.com/s/1kTmhgEz
以上兩個步驟可以統稱
AndroidNDK
環境搭建
AndroidNDK
環境搭建
Android NDK 環境搭建,百度文庫有資料:
http://wenku.baidu.com/view/4c112a06eff9aef8941e0623.html
這是我試過後比較靠譜的,有些資料上關於環境變數配置寫成了(Cygwin home/Administrator/......bash_profile檔案中內容):
ANDROID_NDK_ROOT=/cygdrive/e/develop/android/android-NDK/android-ndk-
1.5_r1
exportANDROID_NDK_ROOT
ANDROID_NDK_ROOT=/cygdrive/e/develop/android/android-NDK/android-ndk-1.5_r1
export ANDROID_NDK
這很明顯不對,一前一後環境變數名稱都不對應,稍微用過linux的都應該知道.
以上配好之後,我們就可以利用Eclipse進行NDK的入門開發了:
同樣也是網上的教程,加上自我糾正和遇到的一些問題的解決方式【後面一一貼出】:
個人是參考如下資料【安裝略過,直接看樣本部分】:
http://blog.csdn.net/samguoyi/article/details/7410716
安裝這種方式基本OK,不過過程中遇到了如下問題:
1.javah不是內部命令:
2. 執行javah -jni jni.sam.you.MyJNI報找不到MyJNI類;
3. 執行$NDK/ndk-build的時候,報***target pattern contains no '%'。停止
4. 資料的工程中的jni檔案夾是自己建立的【至少我是這樣做的,新的的對應的.c和Adnroid.mk都放在裡面,後面利用Cygwin終端執行$NDK/ndk-build產生.so的時候需要進入到該目錄】;
5.android NDK jni下的c檔案 Unresolved inclusion ?
6. 【補充一】以上操作後Eclipse編譯c/c++工程沒問題,但是count << "hello" << endl; 執行後看不到輸出?
解決方式:
1的解決方式:JAVA_HOME的環境變數,一前一後千萬不能有分號,類似C:\Program Files\Java\jdk1.7.0_15 【我之前的是C:\Program Files\Java\jdk1.7.0_15;】所以悲劇了,記得改完後,重新cmd進入,執行javah或者javac看到很多參數提示就OK了!
2的解決方式:按照上訴資料的方式,進入工程的bin目錄,然後執行,我這裡是不行的,然後有個哥們說了,進入src目錄,執行,果然成功了,而且在.....JNITest\src下產生了對應的.h檔案,這個android工程就可以看到【不行重新整理下】;
3的解決方式:由於之前執行的一些命令失敗了,因此導致....JNITest\obj\local\armeabi\objs\hellojni\下的xx.o.d檔案損壞,因此我們只需要刪除該目錄下的檔案,然後重新執行$NDK/ndk-build就可以了.
5的解決方式:
【http://ljj21153.blog.163.com/blog/static/618581162012885153813/】原因是在eclipse編輯環境中沒有找到對應的include中的檔案。解決方案是將包含該檔案的include目錄作為新的linked folder加入工程中。具體方法如下:
1. 右擊工程->New->Folder
2. 對話方塊中點擊Advanced
3. 選擇Link to alternate location (Linked Folder),選擇需要的include目錄
4. Finish後重新整理工程,問題解決。
include 目錄可以在ndk的安裝目錄中找到
例如:/android-ndk-r7b/platforms/android-8/arch-arm/usr/include
工程共用:http://pan.baidu.com/share/link?shareid=1124395894&uk=3927989065
6的解決方式【謝謝網友分享】:
http://blog.csdn.net/johnpub/article/details/9246887
1、在PATH裡加入C:\MinGW\bin,記得,如果裡面還有其他的變數,記得要加個分號啊,分號得在英文輸入模式下輸入的。
2、建立LIBRARY_PATH變數,如果有的話,在值中加入C:\MinGW\lib,這是標準庫的位置。
3、建立C_INCLUDEDE_PATH變數,值設為C:\MinGW\include。
4、建立CPLUS_INCLUDE_PATH變數,值為
C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5\backward;C:\MinGW\include
或者【我的MinGW目錄結構是這樣的】
1、添加MINGW_HOME,值為:C:\MinGW
2、添加C_INCLUDE_PATH,值為%MINGW_HOME%\include
3、添加CPLUS_INCLUDE_PATH,值為
%MINGW_HOME%\lib\gcc;%MINGW_HOME%\lib\gcc\mingw32;%MINGW_HOME%\lib\gcc\mingw32\4.7.2;%MINGW_HOME%\lib\gcc\mingw32\4.7.2\include;%MINGW_HOME%\lib\gcc\mingw32\4.7.2\include\c++;%MINGW_HOME%\lib\gcc\mingw32\4.7.2\include\c++\backward;%MINGW_HOME%\lib\gcc\mingw32\4.7.2\include\c++\mingw32;
4、path添加值:%MINGW_HOME%\bin;
其實windows下比較麻煩,做完這些嘗試之後,我想起之前公司的一套軟體架構,是在ubuntu下搞的,很多都是做好的命令指令碼,一個命令調用所有指令碼就可以進行所以.so庫的產生,最後再產生apk。
其實做完這個之後,就會明白android是如何調用c/c++產生的.so庫的,做完後記得再冥想下......
軟體架構 --- 架構師的能力更多的在於分析問題和解決問題的能力,當然還有領導能力【拙見】!