麒麟子

~~

导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

#

使用R7版NDK搭建Android开发环境[不使用Cgywin]

废话不多说,只说几句。

写这个的初衷是因为公司的项目需要,领导要求我搭建一个Android的开发环境(Eclipse + NDK),我算上找资料,下载,安装,配置环境及写文档,正好用了一个工作日。先把整理好的文档编辑后发在这里,一是因为我觉得这样会帮到一些人,二么,好久没写博客,手痒痒了!

好了,现在开始!

—————————————————分割线———————————————

安装流程

1. 安装JDK.

2. 安装Eclipse(eclipse-cpp-indigo-SR1-incubation-win32.zip,解压即可使用。注:该版本集成CDT)

3. 搭建Android开发环境(参考文档: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 选择需要更新的工具,Finish, 安装完成后重启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 根据实际需要选择相应组件,然后点击install。

默认可安装以下组件,如图一所示:

(图一)

3.4.3 创建一个Android 虚拟设备。选择菜单项的Window ->AVD Manager.

New ,新建一个虚拟设备,具体参数请自行设置。如图二所示:

4. 安装NDK(R7, android-ndk-r7b-windows.zip, 解压即可使用)

注:R7之前的版本,必须要安装Cygwin才能使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。想要做到这一点,只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK。

(图二)

5. NDK实例的实现

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“目录 ,Finish!

保存设置,OK!

5.5.5 右键点击工程TestNDK,Build Project。当在console里面看到如图六所示的信息,则表示一切正常,此时就已经是自动编译代码了。

(图六)

5.5.6 右键点击工程TestNDK,Run As -> Android Application, 运行程序。当出

现图七所示信息时,NDK实例运行成功!

(图七)

6. 可能出现的问题

如图八所示:

(图八)

在 c 文件中,函数名这样定义:

Java_testNDK_android_HelloJni_stringFromJNI ,是因为这个是 JNI 的标准,定义需要按照如下格式:

Java_packagename_classname_methodname ,

例如: Java_testNDK_android_HelloJni_stringFromJNI

—————————————————分割线—————————————————

由于本人水平有限,所写文字肯定会有不妥之处,欢迎牛人指出答疑,我就在此抛砖引玉了,谢谢~

欢迎转载,转载请注明转自:http://www.cnblogs.com/xiaomiao

posted @ 2013-02-22 22:39 麒麟子 阅读(1484) | 评论 (0)编辑 收藏

终于,我生命中第一次编译并运行了手机程序

Android的环境搭建是相当麻烦,拆腾了很多次,这一次终于狠下心来,研究了三天。

可能不同的人遇上的错误不一样吧。 网上找来的文章也不能解决所有问题。 但最完整的一篇要算下面这个。它基本上描述出了我所遇上的所有问题。

 

让人死去活来的cocos2d-x安卓开发环境搭建(windows+eclipse+ndk 不用cygwin)

http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html

若原文链接失效,本博客上一篇就是它了。

值得注意的是几点

第一、JDK 用的是1.6的,我最开始是1.7的,不好使。也遇上了各种错误。

第二、Android SDK的开发最好选择2.2以及以上,不然编译也会有两三个函数过不了。

第三、在用Android手机调式的时候,可能找不到设备。 此时可以先点一下 打开USB存储设备 等驱动装好再关掉。如果还是没反应。 就下一个豌豆荚吧。直接就搞定。装好以后,可以卸载掉它。 手机上的调试选项一定要开。

第四、文章中提到的编辑出错和资源拷贝不要忘记了。

第五、NDK_MOUDLE_PATH要记得配置,因为文章中只有几句话。容易看掉。

第六、我的AVD还是运行不了,只能真机调试。 无奈中。

最后上图,以此纪念迈出的这一小步。

2000

posted @ 2013-02-22 22:39 麒麟子 阅读(269) | 评论 (0)编辑 收藏

安卓环境搭建

原文出处:http://www.cnblogs.com/ybgame/archive/2012/06/07/2540693.html

【一 写在前面】

环境搭建的顺序是这样

1.JDK&JRE 安装JDK会顺带安装JRE的,这一步是为了可以编写和允许普通的JAVA程序

2.Eclipse JAVA 的 IDE,这一步是为了方便地开发JAVA程序

3.CDT 是Eclipse的一个插件,这一步是为了可以引入C++

4.ADT 是Eclipse的一个插件,这一步是为了管理安卓开发库

5.ADK 上一步是工具,这一步就是开发库了,到了这一步你可以编写普通的安卓程序

6.NDK 单有CDT还不行,它只能编辑,不能编译,这一步是为了可以编译C++程序,然后在安卓中使用

这里不需要使用cygwin这个麻烦的东西,我们使用新版本的ndk来编译C++

【二 JDK的安装】

JDK的最新版本是1.7,【重要】这里需要下载使用 1.6的JDK,JDK自动包含JRE,使用1.7的JDKcocos的代码会有"暂时性编译错误"问题

下载安装都是一路Next,下面的内容是安装1.7之后降1.6的方法,直接安装1.6的可以飘过

下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html

根据自己的操作系统选择,这里我用的是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即可

此时你会发现更多的红叉叉,所有文件都出现红叉叉了,让我们把他们消除掉,这次很简单,刚刚重置JRE的时候,吧安卓也重置掉了

把安卓ADK勾上就可以了

【三 安装Eclipse和CDT】

这里我直接用这一个,带CDT插件,已经有Eclipse的同学可以去下载一个CDT

Eclipse解压就可以直接使用了,这里不墨迹

Eclipse C++版本下载地址 http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers-includes-incubating-components/indigosr2

【四 安装ADT】

两种安装方法,一种在线安装,一种下载安装,网速问题,我倾向于下载安装。

注意,请下载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。这个安装需要一段时间.....不要以为它死机了,挂了,如果你的机器或者网络不给力,让你感觉到不耐烦

请不要强制关闭它....否则,你可能要看接下来的错误排除

安装完毕之后重启Eclipse,然后会提示你安装ADK

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

它将无法创建安卓项目...,而卸载,也是一个麻烦的事情

首先,需要把这个插件删除,在Help的About找到对应的ADT,然后删除

接下来从软件更新列表中,删除我们的ADT

【五 安装ADK】

安装完ADT之后,重启Eclipse会提示你安装ADK,你可以指定路径,或者下载安装

可以在这个地址下载ADK http://developer.android.com/sdk/index.html

如果是下载的话,建议下载2.1,他的兼容性比较好,本地的话,指定ADK解压后的路径即可

【六 安装NDK】

到这里为止,我们已经可以使用Eclipse来编写安卓程序了,但我们的目的是用C++编写cocos,要达到这个目的,还需要最后一步——NDK

使用NDK有两个目的,第一个是将我们的C++代码编译成链接库,这里的链接库是Linux下的so或者a文件,不同于windows的dll

第二个目的是Jni,Java需要通过Jni来调用我们的C++代码

下载地址为:http://dl.google.com/android/ndk/android-ndk-r7-windows.zip

下载完毕之后解压,这里给出最简单的步骤,在编译的过程中会碰到各种问题,这里也将一一解答

首先我们要创建一个Android项目

使用最新版本的Cocos2d-x,我们用他的HelloWorld来做试验

项目打开之后,,,,这里发现一个错误,没有setEGLContextClientVersion这个方法,这里,暂时把它注释掉吧

看意思应该是设置OpenGL ES的版本....反正默认的应该可以

然后看到控制台输出一句话

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

接下来我们要把NDK加进来,让NDK来编译我们的C++

指定ndk-build.cmd来编译我们的项目,下面的工作路径将作为参数传入给ndk-build.cmd,

我们选择项目的路径,它会自动编译jni子目录下的Android.mk

这时候如果是cocos2d-1.0.1-x-0.13.0-beta以及之前的版本,是可以进行编译的,但如果是之后的版本,有可能出现如下错误

Android.mk引用了一个模块,cocos2dx模块,而NDK没有找到它,所以报了这个错,

之前的版本是直接包含cocos2dx模块的Android.mk的,所以不会报错

而这里使用了import,我们也可以使用之前版本的方法来包含它,但貌似import比之前的方法要更好一些

错误信息提示我们,可以通过设置NDK_MODULE_PATH环境变量,这里很有可能设置错误

一般,一个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,有些头文件没找到,一些类型也有问题....密密麻麻地近百个错误。。。

我们试着用低一点的版本吧

接下来又出现了一个找不到静态库的问题

把<NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi/目录下的libgnustl_static.a

拷贝到obj/local/armeabi/libgnustl_static.a目录下,解决

最后生成的apk放在bin目录下

PS.资源文件需要放在assets下,ADT会将它打包到apk中

posted @ 2013-02-22 22:39 麒麟子 阅读(683) | 评论 (0)编辑 收藏

about porting

http://www.diybl.com/course/3_program/c/c_js/20100710/426527.html

http://www.cppblog.com/lyricc/archive/2012/01/12/164071.aspx

搞了几个跨Linux与Windows的项目,碰到很多问题,记下来,以供查考。另外,因为水平的原因,肯定错误在所难免,请读者一定指正。

  如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境。

  下面大概分几个方面进行罗列:

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中,发送与接收数据时,直接使用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调用来查询文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。为了支持更大的文件查询,可以在Linux环境下加_FILE_OFFSET_BITS=64定义,在Windows下面使用_stat64调用,入参为 struct __stat64。

  Linux中可根据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结构是32位的无符号整形。而windows中,time_t结构是64位的整形。如果要在windows始time_t为32位无符号整形,可以加宏定义,_USE_32BIT_TIME_T。

  Linux中,sleep的单位为秒。Windows中,Sleep的单位为毫秒。即,Linux下sleep (1),在Windows环境下则需要Sleep (1000)。

  Windows中的timecmp宏,不支持大于等于或者小于等于。

  Windows中没有struct timeval结构的加减宏可以使用,需要手动定义:

#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来调用外部程序。Windows最好使用WinExec,因为WinExec可以支持是打开还是隐藏程序窗口。用WinExec的第二个入参指明,如SW_SHOW/SW_HIDE。

杂项

  Linux为srandom和random函数,Windows为srand和rand函数。

  Linux为snprintf,Windows为_snprintf。

  同理,Linux中的strcasecmp,Windows为_stricmp。

错误处理

  Linux下面,通常使用全局变量errno来表示函数执行的错误号。Windows下要使用GetLastError ()调用来取得。

Linux环境下仅有的

  这些函数或者宏,Windows中完全没有,需要用户手动实现。

  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;
}

posted @ 2013-02-22 22:38 麒麟子 阅读(468) | 评论 (0)编辑 收藏

Android SDK r20.x更新时,没有Android API的问题

很久没写日志了,今天要记录一个让我觉得很纠结的问题。

今天突然想尝试一下最新版的ANDROID SDK的滋味。但在升级的时候却发现没有API列表。

如下图,红圈内的内容。

image

纠结了很久。 先是在官网上下载的 installer_r20.0.3-windows.exe

安装后启动了Android SDK Manager。 启动后发现情况依旧。

于是又在网上找了一个绿色版android-sdk_r20-windows.zip

发现运行后依然显示不出API。

 

实在无耐,开始百度。 找了许久,终于有一位老兄给了明确的说法。并且也成功了。贴出来表示感激

android-sdk_r20.0.3-windows无法正常更新 http://my.oschina.net/jerikc/blog/77406

 

下面是原文内容,不想跳转的朋友可以直接看这里。 同时也是为了防止原文失效。

--------------------------------

在www.android.com下载最新版的android-sdk_r20.0.3-windows之后,点击SDK Manager.exe,发现无法显示Updates/New的内容,因此无法进行更新。

菜单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文件拷贝出来,修改完后再替换原来的。

 

 

至于为什么更新后就不行了,我就不清楚了。 原贴中的评论可供参考。。。

posted @ 2013-02-22 22:38 麒麟子 阅读(3057) | 评论 (2)编辑 收藏

仅列出标题
共38页: First 5 6 7 8 9 10 11 12 13 Last