一、JDK,CYGWIN
首先安装JDK 和 Cygwin。
如果之前在电脑上安装过JDK,并卸载过,就会遇见卸载不完全从而导致新的JDK安装不正确。这个时候就需要手动在注册表中删除JDK的信息,在windows上可以运行regedit.exe,然后在里面搜索JDK,SUN,JRE,等关键字,然后全部删除,即可完全删除JDK.
Cygwin装起来貌似也比较费劲,可以在网上多参考一些文章。
二、安装Android 开发环境
现在安装Android的开发环境还是比较简单的,在 Android Developers 上有 ADT Bundle 下载,ADT Bundle集成了Eclipse + ADT plugin和SDK,还有一些开发工具,如果只是开发Android程序,那么就够了。下载下来解压,路径中不能出现空格,否则不能正常使用。
运行SDK Manager.exe 可以来管理和安装SDK,选择自己需要的版本直接安装就行了,非常方便。
在最新版本的SDK Manager.exe中还可以管理AVD,AVD就是Android的模拟器。我们可以在创建一些模拟器,供在开发的时候使用。
SDK和AVD都弄好了,现在Android的基本开发环境就弄好了,然后我们就可以在Eclipse中创建一些demo来熟悉一下环境。
三、NDK环境配置
有时候我们会需要使用C/C++的一些代码,这个时候就需要用到NDK。我们可以在Java代码中调用C/C++的代码,或者C/C++调用Java的代码,这里需要用到JNI做转换。
可以在Android Developers上下载NDK,同样只需要解压出来就行。然后在Cygwin中配置NDK的路径。在/home/<username>/.bash_profile文件末尾加入NDK的路径。像这样:NDK=/cygdrive/d/adt-bundle-windows-x86_64/android-ndk-r8d
重启Cygwin的命令行,然后就搞定了。
NDK的使用
在NDK的目录下有些例子还有说明文档,可以先看一遍。如果在Java中使用了Native函数,那么就需要先生成JNI的头文件,然后在根据JNI的头文件去实现。
如果是使用Eclipse构建的project,只需要在Cygwin命令行下进入project/bin/classes目录下,然后运行 javah 命令,就会自动生成 .h 的头文件。
例如:javah -classpath . com.UC.jnitest.MainActivity
在 project 目录下创建 jni 目录,把生成的 .h 头文件拷贝过来,然后就可以根据头文件实现 c/cpp 文件。最后我们需要使用NDK来生成so文件供Java调用,这时候就需要用到Ardroid.mk文件,这个其实也比较简单,可以参考NDK目录下的例子,然后将要生成的so文件名和使用到的c/cpp文件修改过来就ok了。
在project目录下使用$NDK/ndk-build命令,就能自动生成so文件。
四、JNI编程注意点
在JNI编程中要注意内存的泄露,尤其是JNI Local Reference比较容易引起内存泄露,吃饭的时候有想到这个问题,然后在测试代码的时候发现了问题所在。
详情参考:http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/index.html?ca=drs-
五、在C/C++中使用Android的LogCat
要使用LogCat,需要包含android/log.h 这个文件。并且在Android.mk中加入参数,将其连接进来:LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
查看log.h文件会发现,里面有提供几个函数入口供打印日志,我在使用的过程中将去简单包装了一下。
#include <android/log.h>
#include <sys/timeb.h>
#include <stdio.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "verbose", __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "debug", __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "info", __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "warn", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "error", __VA_ARGS__)
这样就可以在C/C++的代码中类似这样: LOGE(“error”) 打印日志。
六、在C中使用毫秒级别时间
long long getSystemTime()
{
struct timeb t;
ftime(&t);
return 1000L * t.time + t.millitm;
}
开发中需要很重要的是调试的环境,可以将NDK集成到Eclipse中,使用ADB来调试,这些有空的时候再去学习一下。