#
廢話不多說,只說幾句。
寫這個的初衷是因為公司的項目需要,領導要求我搭建一個Android的開發(fā)環(huán)境(Eclipse + NDK),我算上找資料,下載,安裝,配置環(huán)境及寫文檔,正好用了一個工作日。先把整理好的文檔編輯后發(fā)在這里,一是因為我覺得這樣會幫到一些人,二么,好久沒寫博客,手癢癢了!
好了,現(xiàn)在開始!
—————————————————分割線———————————————
安裝流程
1. 安裝JDK.
2. 安裝Eclipse(eclipse-cpp-indigo-SR1-incubation-win32.zip,解壓即可使用。注:該版本集成CDT)
3. 搭建Android開發(fā)環(huán)境(參考文檔:http://developer.android.com/sdk/installing.html)
3.1 安裝Android SDK(installer_r16-windows)
3.2 安裝Eclipse的ADT插件.
3.2.1 啟動Eclipse, 選擇菜單項的Help->Install New Software
3.2.2 點擊Add, 輸入名稱,然后在URL中輸入:
http://dl-ssl.google.com/android/eclipse/,OK!
3.2.3 選擇需要更新的工具,F(xiàn)inish, 安裝完成后重啟Eclipse。
3.3 配置ADT插件
3.3.1 啟動Eclipse,選擇菜單項的Window -> Preferences
3.3.2 選擇Android,在SDK Location中選擇SDK的安裝目錄,OK!
完成后重新啟動Eclipse。
3.4 添加平臺和其他組件
3.4.1 啟動Eclipse,選擇菜單項的Window -> Android SDK Manager
3.4.2 根據(jù)實際需要選擇相應組件,然后點擊install。
默認可安裝以下組件,如圖一所示:

(圖一)
3.4.3 創(chuàng)建一個Android 虛擬設備。選擇菜單項的Window ->AVD Manager.
New ,新建一個虛擬設備,具體參數(shù)請自行設置。如圖二所示:
4. 安裝NDK(R7, android-ndk-r7b-windows.zip, 解壓即可使用)
注:R7之前的版本,必須要安裝Cygwin才能使用NDK。從R7開始,Windows版本的NDK提供了一個ndk-build.cmd腳本,可以直接利用這個腳本編譯。想要做到這一點,只要為Eclipse Android工程添加一個Builder,就能實現(xiàn)Eclipse的自動編譯NDK。

(圖二)
5. NDK實例的實現(xiàn)
5.1 啟動Eclipse,新建Android工程(此處名為TestNDK),如圖三所示:

(圖三)
5.2 在TestNDK工程的根目錄下新建文件夾jni,之后找到NDK的安裝目錄(\samples\hello-jni\jni)下的 Android.mk和hello-jni.c 這兩個文件,將其拷貝到TestNDK->jni文件夾下面。
5.3 找到NDK的安裝目錄(\samples\hello-jni\src\com\example\hellojni)下的HelloJni.java文件,將其拷貝到TestNDK工程src文件夾對應的包下。
5.4 修改項目文件AndroidManifest.xml,將activity標簽下的 android:name =“.TestNDKActivity”修改為 android:name =“.HelloJni”。(注:此處的
TestNDKACtivity為項目自動生成的,項目不同,此處也會不同)
5.5 新建并配置一個Builder
5.5.1 點擊Project->Properties->Builders->New,新建立一個Builder。在彈出的對話框上面點擊Program,OK!如圖四所示:

(圖四)
5.5.2 在彈出的對話框【Edit Configuration】中,配置選項卡【Main】:
Location中需要填入nkd-build.cmd的路徑(NDK安裝目錄下)。
Working Diretcoty中需要填入TestNDK的工程根目錄。
如圖五所示:
5.5.3 在彈出的對話框【Edit Configuration】中,配置選項卡【Refresh】:
勾選“Refresh resources upon completion”,
勾選“The entire workspace”,
勾選“Recuresively include sub-folders”。

(圖五)
5.5.4 在彈出的對話框【Edit Configuration】中,配置選項卡【Build Options】:
勾選“After a “Clean””,
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”。
點擊“Specify Resources…”勾選TestNDK工程的“jni“目錄 ,F(xiàn)inish!
保存設置,OK!
5.5.5 右鍵點擊工程TestNDK,Build Project。當在console里面看到如圖六所示的信息,則表示一切正常,此時就已經(jīng)是自動編譯代碼了。

(圖六)
5.5.6 右鍵點擊工程TestNDK,Run As -> Android Application, 運行程序。當出
現(xiàn)圖七所示信息時,NDK實例運行成功!

(圖七)
6. 可能出現(xiàn)的問題
如圖八所示:

(圖八)
在 c 文件中,函數(shù)名這樣定義:
Java_testNDK_android_HelloJni_stringFromJNI ,是因為這個是 JNI 的標準,定義需要按照如下格式:
Java_packagename_classname_methodname ,
例如: Java_testNDK_android_HelloJni_stringFromJNI
—————————————————分割線—————————————————
由于本人水平有限,所寫文字肯定會有不妥之處,歡迎牛人指出答疑,我就在此拋磚引玉了,謝謝~
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明轉(zhuǎn)自:http://www.cnblogs.com/xiaomiao
Android的環(huán)境搭建是相當麻煩,拆騰了很多次,這一次終于狠下心來,研究了三天。
可能不同的人遇上的錯誤不一樣吧。 網(wǎng)上找來的文章也不能解決所有問題。 但最完整的一篇要算下面這個。它基本上描述出了我所遇上的所有問題。
讓人死去活來的cocos2d-x安卓開發(fā)環(huán)境搭建(windows+eclipse+ndk 不用cygwin)
http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html
若原文鏈接失效,本博客上一篇就是它了。
值得注意的是幾點
第一、JDK 用的是1.6的,我最開始是1.7的,不好使。也遇上了各種錯誤。
第二、Android SDK的開發(fā)最好選擇2.2以及以上,不然編譯也會有兩三個函數(shù)過不了。
第三、在用Android手機調(diào)式的時候,可能找不到設備。 此時可以先點一下 打開USB存儲設備 等驅(qū)動裝好再關掉。如果還是沒反應。 就下一個豌豆莢吧。直接就搞定。裝好以后,可以卸載掉它。 手機上的調(diào)試選項一定要開。
第四、文章中提到的編輯出錯和資源拷貝不要忘記了。
第五、NDK_MOUDLE_PATH要記得配置,因為文章中只有幾句話。容易看掉。
第六、我的AVD還是運行不了,只能真機調(diào)試。 無奈中。
最后上圖,以此紀念邁出的這一小步。

原文出處:http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html
【一 寫在前面】
環(huán)境搭建的順序是這樣
1.JDK&JRE 安裝JDK會順帶安裝JRE的,這一步是為了可以編寫和允許普通的JAVA程序
2.Eclipse JAVA 的 IDE,這一步是為了方便地開發(fā)JAVA程序
3.CDT 是Eclipse的一個插件,這一步是為了可以引入C++
4.ADT 是Eclipse的一個插件,這一步是為了管理安卓開發(fā)庫
5.ADK 上一步是工具,這一步就是開發(fā)庫了,到了這一步你可以編寫普通的安卓程序
6.NDK 單有CDT還不行,它只能編輯,不能編譯,這一步是為了可以編譯C++程序,然后在安卓中使用
這里不需要使用cygwin這個麻煩的東西,我們使用新版本的ndk來編譯C++
【二 JDK的安裝】
JDK的最新版本是1.7,【重要】這里需要下載使用 1.6的JDK,JDK自動包含JRE,使用1.7的JDKcocos的代碼會有"暫時性編譯錯誤"問題
下載安裝都是一路Next,下面的內(nèi)容是安裝1.7之后降1.6的方法,直接安裝1.6的可以飄過
下載地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html
根據(jù)自己的操作系統(tǒng)選擇,這里我用的是Java SE Development Kit 6u30

如果你像我一樣不幸,裝上了1.7,可以用下面的方法來恢復降到1.6
1.打開windows的Preferences,把Compiler compliance level 設置到1.6
然后會顯示讓你配置JRE

在配置jre中添加jre的目錄,然后選定

這里,我們在Eclipse里面設置好了JRE6,以及編譯使用的JDK,但還不可以
接下來要設置一下你的項目,打開Project Properties,Add Library 然后Next,接下來會要你選擇JRE的路徑

這里我們直接選擇剛剛在windows Preferences設置好的JRE6,然后Finish即可

此時你會發(fā)現(xiàn)更多的紅叉叉,所有文件都出現(xiàn)紅叉叉了,讓我們把他們消除掉,這次很簡單,剛剛重置JRE的時候,吧安卓也重置掉了

把安卓ADK勾上就可以了
【三 安裝Eclipse和CDT】
這里我直接用這一個,帶CDT插件,已經(jīng)有Eclipse的同學可以去下載一個CDT
Eclipse解壓就可以直接使用了,這里不墨跡
Eclipse C++版本下載地址 http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers-includes-incubating-components/indigosr2
【四 安裝ADT】
兩種安裝方法,一種在線安裝,一種下載安裝,網(wǎng)速問題,我傾向于下載安裝。
注意,請下載1.7及以上版本的ADT,這里使用1.8的版本
在Help里面,選擇Install New Software...


然后選擇Add,如果是在線安裝,在Location里面填https://dl-ssl.google.com/android/eclipse/
(不行的話,把https改為http試試)
如果是下載安裝,先把ADT下載到本地,然后按Archive選擇ADT的路徑,點 ok,勾上Developer Tools開始安裝
ADT 1.8的地址:http://dl.google.com/android/ADT-18.0.0.zip
PS。這個安裝需要一段時間.....不要以為它死機了,掛了,如果你的機器或者網(wǎng)絡不給力,讓你感覺到不耐煩
請不要強制關閉它....否則,你可能要看接下來的錯誤排除
安裝完畢之后重啟Eclipse,然后會提示你安裝ADK

如果你非常不幸安裝了1.6以及以前版本的ADT,或者強制中斷了它的安裝....那么你需要把它卸掉

它將無法創(chuàng)建安卓項目...,而卸載,也是一個麻煩的事情
首先,需要把這個插件刪除,在Help的About找到對應的ADT,然后刪除

接下來從軟件更新列表中,刪除我們的ADT

【五 安裝ADK】
安裝完ADT之后,重啟Eclipse會提示你安裝ADK,你可以指定路徑,或者下載安裝
可以在這個地址下載ADK http://developer.android.com/sdk/index.html
如果是下載的話,建議下載2.1,他的兼容性比較好,本地的話,指定ADK解壓后的路徑即可

【六 安裝NDK】
到這里為止,我們已經(jīng)可以使用Eclipse來編寫安卓程序了,但我們的目的是用C++編寫cocos,要達到這個目的,還需要最后一步——NDK
使用NDK有兩個目的,第一個是將我們的C++代碼編譯成鏈接庫,這里的鏈接庫是Linux下的so或者a文件,不同于windows的dll
第二個目的是Jni,Java需要通過Jni來調(diào)用我們的C++代碼
下載地址為:http://dl.google.com/android/ndk/android-ndk-r7-windows.zip
下載完畢之后解壓,這里給出最簡單的步驟,在編譯的過程中會碰到各種問題,這里也將一一解答
首先我們要創(chuàng)建一個Android項目

使用最新版本的Cocos2d-x,我們用他的HelloWorld來做試驗

項目打開之后,,,,這里發(fā)現(xiàn)一個錯誤,沒有setEGLContextClientVersion這個方法,這里,暫時把它注釋掉吧
看意思應該是設置OpenGL ES的版本....反正默認的應該可以

然后看到控制臺輸出一句話

這里在Application.mk加上APP_PLATFORM :=android-4就可以了

接下來我們要把NDK加進來,讓NDK來編譯我們的C++

指定ndk-build.cmd來編譯我們的項目,下面的工作路徑將作為參數(shù)傳入給ndk-build.cmd,
我們選擇項目的路徑,它會自動編譯jni子目錄下的Android.mk

這時候如果是cocos2d-1.0.1-x-0.13.0-beta以及之前的版本,是可以進行編譯的,但如果是之后的版本,有可能出現(xiàn)如下錯誤

Android.mk引用了一個模塊,cocos2dx模塊,而NDK沒有找到它,所以報了這個錯,
之前的版本是直接包含cocos2dx模塊的Android.mk的,所以不會報錯
而這里使用了import,我們也可以使用之前版本的方法來包含它,但貌似import比之前的方法要更好一些
錯誤信息提示我們,可以通過設置NDK_MODULE_PATH環(huán)境變量,這里很有可能設置錯誤
一般,一個Android.mk包含一個或多個模塊,當你要import cocos2dx模塊時,
他會在這個路徑下% NDK_MODULE_PATH\cocos2dx尋找Android.mk文件
所以我們編輯我們的Builder

添加NDK_MODULE_PATH變量,注意要寫兩個路徑,用分號分開
D:\SDK\cocos2d-2.0-rc0a-x-2.0;D:\SDK\cocos2d-2.0-rc0a-x-2.0\cocos2dx\platform\third_party\android\prebuilt
因為cocos2dx還import了其他幾個module,第二個路徑制定了第三方的module,設置完就可以進行編譯了

我用的是最新的2.0,有些頭文件沒找到,一些類型也有問題....密密麻麻地近百個錯誤。。。
我們試著用低一點的版本吧
接下來又出現(xiàn)了一個找不到靜態(tài)庫的問題

把<NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi/目錄下的libgnustl_static.a
拷貝到obj/local/armeabi/libgnustl_static.a目錄下,解決

最后生成的apk放在bin目錄下
PS.資源文件需要放在assets下,ADT會將它打包到apk中
http://www.diybl.com/course/3_program/c/c_js/20100710/426527.html
http://www.shnenglu.com/lyricc/archive/2012/01/12/164071.aspx
搞了幾個跨Linux與Windows的項目,碰到很多問題,記下來,以供查考。另外,因為水平的原因,肯定錯誤在所難免,請讀者一定指正。
如無其它說明,本文所指Linux均表示2.6內(nèi)核Linux,GCC編譯器,Windows均表示W(wǎng)indows XP系統(tǒng),Visual Studio 2005 sp1編譯環(huán)境。
下面大概分幾個方面進行羅列:
socket
Linux要包含
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
等頭文件,而windows下則是包含 #include <winsock.h>
。
Linux中socket為整形,Windows中為一個SOCKET。
Linux中關閉socket為close,Windows中為closesocket。
Linux中有變量socklen_t,Windows中直接為int。
因為linux中的socket與普通的fd一樣,所以可以在TCP的socket中,發(fā)送與接收數(shù)據(jù)時,直接使用read和write。而windows只能使用recv和send。
設置socet選項,比如設置socket為非阻塞的。Linux下為
flag = fcntl (fd, F_GETFL);
fcntl (fd, F_SETFL, flag | O_NONBLOCK);
,Windows下為 flag = 1;
ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);
。
當非阻塞socket的TCP連接正在進行時,Linux的錯誤號為EINPROGRESS,Windows的錯誤號為WSAEWOULDBLOCK。
file
Linux下面,文件換行是"\n",而windows下面是"\r\n"。
Linux下面,目錄分隔符是"/",而windows下面是"\"。
Linux與Windows下面,均可以使用stat調(diào)用來查詢文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。為了支持更大的文件查詢,可以在Linux環(huán)境下加_FILE_OFFSET_BITS=64定義,在Windows下面使用_stat64調(diào)用,入?yún)?struct __stat64。
Linux中可根據(jù)stat的st_mode判斷文件類型,有S_ISREG、S_ISDIR等宏。Windows中沒有,需要自己定義相應的宏,如
#define S_ISREG(m) (((m) & 0170000) == (0100000))
#define S_ISDIR(m) (((m) & 0170000) == (0040000))
Linux中刪除文件是unlink,Windows中為DeleteFile。
time
Linux中,time_t結(jié)構(gòu)是32位的無符號整形。而windows中,time_t結(jié)構(gòu)是64位的整形。如果要在windows始time_t為32位無符號整形,可以加宏定義,_USE_32BIT_TIME_T。
Linux中,sleep的單位為秒。Windows中,Sleep的單位為毫秒。即,Linux下sleep (1),在Windows環(huán)境下則需要Sleep (1000)。
Windows中的timecmp宏,不支持大于等于或者小于等于。
Windows中沒有struct timeval結(jié)構(gòu)的加減宏可以使用,需要手動定義:
#define MICROSECONDS (1000 * 1000)
#define timeradd(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % MICROSECONDS; \
if ((t1)->tv_usec + (t2)->tv_usec > MICROSECONDS) (t3)->tv_sec ++; \
} while (0)
#define timersub(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec - (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec - (t2)->tv_usec; \
if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += MICROSECONDS; \
} while (0)
process
Linux下可以直接使用system來調(diào)用外部程序。Windows最好使用WinExec,因為WinExec可以支持是打開還是隱藏程序窗口。用WinExec的第二個入?yún)⒅该鳎鏢W_SHOW/SW_HIDE。
雜項
Linux為srandom和random函數(shù),Windows為srand和rand函數(shù)。
Linux為snprintf,Windows為_snprintf。
同理,Linux中的strcasecmp,Windows為_stricmp。
錯誤處理
Linux下面,通常使用全局變量errno來表示函數(shù)執(zhí)行的錯誤號。Windows下要使用GetLastError ()調(diào)用來取得。
Linux環(huán)境下僅有的
這些函數(shù)或者宏,Windows中完全沒有,需要用戶手動實現(xiàn)。
atoll
long long
atoll (const char *p)
{
int minus = 0;
long long value = 0;
if (*p == '-')
{
minus ++;
p ++;
}
while (*p >= '0' && *p <= '9')
{
value *= 10;
value += *p - '0';
p ++;
}
return minus ? 0 - value : value;
}
gettimeofday
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define EPOCHFILETIME 11644473600000000Ui64
#else
#define EPOCHFILETIME 11644473600000000ULL
#endif
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};
int
gettimeofday (struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
LARGE_INTEGER li;
__int64 t;
static int tzflag;
if (tv)
{
GetSystemTimeAsFileTime (&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
t = li.QuadPart; /* In 100-nanosecond intervals */
t -= EPOCHFILETIME; /* Offset to the Epoch time */
t /= 10; /* In microseconds */
tv->tv_sec = (long) (t / 1000000);
tv->tv_usec = (long) (t % 1000000);
}
if (tz)
{
if (!tzflag)
{
_tzset ();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}
return 0;
}
很久沒寫日志了,今天要記錄一個讓我覺得很糾結(jié)的問題。
今天突然想嘗試一下最新版的ANDROID SDK的滋味。但在升級的時候卻發(fā)現(xiàn)沒有API列表。
如下圖,紅圈內(nèi)的內(nèi)容。
糾結(jié)了很久。 先是在官網(wǎng)上下載的 installer_r20.0.3-windows.exe
安裝后啟動了Android SDK Manager。 啟動后發(fā)現(xiàn)情況依舊。
于是又在網(wǎng)上找了一個綠色版android-sdk_r20-windows.zip
發(fā)現(xiàn)運行后依然顯示不出API。
實在無耐,開始百度。 找了許久,終于有一位老兄給了明確的說法。并且也成功了。貼出來表示感激
android-sdk_r20.0.3-windows無法正常更新 http://my.oschina.net/jerikc/blog/77406
下面是原文內(nèi)容,不想跳轉(zhuǎn)的朋友可以直接看這里。 同時也是為了防止原文失效。
--------------------------------
在www.android.com下載最新版的android-sdk_r20.0.3-windows之后,點擊SDK Manager.exe,發(fā)現(xiàn)無法顯示Updates/New的內(nèi)容,因此無法進行更新。
菜單Tools-->options中的Force https://...sources to be fetched using http://...勾選上之后,問題依舊。
最終解決方案:
在C:\WINDOWS\system32\drivers\etc目錄下,找到hosts文件,在文件末尾加上
74.125.237.1 dl-ssl.google.com
---------------------------------
如果是WIN7用戶,可能無法直接修改hosts文件。
有兩個方法。一個是先用管理員身份運行記事本,再把hosts拖進去。就可以使用保存了。
另一個就是先把hosts文件拷貝出來,修改完后再替換原來的。
至于為什么更新后就不行了,我就不清楚了。 原貼中的評論可供參考。。。