终于下定决心开始写博客了,现在还是菜鸟一只,只能玩玩基础,废话不多说,这是羽化第一篇博客文章,以后会定期更新自己最近学习经历的文章,与大家共同学习,如果有错的地方希望大家指点,由于我还在学习中,大部分代码引用他人,如有冒犯,请见谅,非常感谢那些无私贡献的人,还有感谢公司里照顾我的同事们-0-
开发环境
Window XP
Eclipse Helios Service Release 2
NDK-r5c
cygwin 1.7.9
MB525 defy 部分代码要求系统2.2或2.2以上
本次学习
1.NDK需求方向
2.NDK环境搭建
3.NDK使用方法
4.NDK使用延展
1.NDK需求方向
网上很多介绍NDK的作用,我这只是说说基本方向,NDK提供的API不多,这些API主要用于游戏开发、性能挖掘等,比如:
l OpenGL 2.0,包括支持(Java)SDK所支持的一些新版本
l Math,(一些,但非全部的,专门针对计算的算法。在native层面实现可获得更好的性能)
l 2D graphics,从2.2开始支持像素缓冲(pixelbuffer)
l libc,提供了兼容性支持,并可能为移植现有native代码提供方便
2.NDK环境搭建
1)在Eclipse中增加C/C++支持 //非必须
在Eclipse中选择Help—>Install new software,选择相应版本的站点选择下图的组建安装。
2)安装Cygwin 模拟提供Unix环境的工具
可以到www.cygwin.com下载Cygwin,选择在线安装(非常漫长。。。),在安装过程中Devel根节点边上的“Default”要点成“Install”。
也可以离线安装,LocalPackage Directory步骤中选择自己离线包的目录。Devel根节点也要点成“Install”。
注意:Cygwin很不安装很不稳定,如果第一次没安装成功就再安装一次试试。
若要检查必要工具是否安装成功,可以打开Cygwin后在里面输入gcc -v和make -v 可以看到相应信息。我是安装在C盘根目录下。
3)安装NDK
可以在http://developer.android.com/sdk/ndk/index.html下载最新的NDK,下载完成后放在任意地方,我是解压放在C盘根目录下。
3.NDK使用方法
先从简单的Hello开始,了解NDK的使用方法。
1) 创建项目NDK1,输入相应代码
无论是调用还是生成so,都必须要加载库和声明本地代码。
// 加载库 – 名字必须匹配jni/Android.mk
static
{
System.loadLibrary("NDK12");
}
// 声明本地代码函数 – 必须匹配NDK1.c
private native String invokeNativeFunction();
注意:如果so文件生成后项目名字发生改变,生成的so文件是不能使用的,必须重新生成一遍。
2) 根节点创建一个文件夹jni,里面生成两个文件Android.mk和NDK1.c //Android.mk名字不能更改
3) NDK1.c是C语言的内容,这里jstring表示返回的是String类型,后面的包路径一定不能搞错。
#include <string.h>
#include <jni.h>
jstring Java_com_LB_NDK1_NDK1_invokeNativeFunction(JNIEnv* env, jobject javaThis)
{
return (*env)->NewStringUTF(env, "Hello from native code!");
}
4) Android.mk里面输入的数据必须按照一定的规则,其格式可以在网上查到。其中LOCAL_SRC_FILES的文件命要与C语言程序的文件名一样,LOCAL_MODULE的内容必须和主类里面的System.loadLibrary的内容一致。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := NDK12
LOCAL_SRC_FILES := NDK1.c
include $(BUILD_SHARED_LIBRARY)
5)准备步骤都完成了,就可以开始生成so文件 这里命令的写法可以去查下linux的常见命令
打开cygwin,在cygwin中打开项目所在的文件夹,为了方便把项目放在了C盘根目录下,输入cd /cygdrive/c/NDK1 就到了项目目录中。
/cygdrive/c/NDK1 运行NDK目录中的nkd-build就会自动生成so文件
此时打开项目会发现多出来两个文件夹obj和libs,里面就放着编译好的so文件
6) 此时运行项目,可以得到C语言中传来的字符串了,注意:C语言传输的String只能为UTF-8编码格式
4.NDK使用延展
1)运行一个简单算法
这里是用NDK2的例子,实现一个四则运算算法。
代码方面基本类似,这里使用了另一种生成方法,先生成一个.h的头文件。
具体生成方法,可以在cygwin中或者命令窗口中完成,这里在命令窗口中完成。
生成后放到jni目录下就可以了,其中NDK2.c写法发生了改变。
2)改变图片灰度
NDK3的例子,实现把一张图片灰度改变,和传统方法进行比较。
注意:由于是C++文件,所以Android.mk的写法发生改变
3) 数据传输
NDK4的例子,实现数据传输,在SD卡上创建文件。据说速度快于Android的传统方法。
4) 改变图片加强版
NDK5的例子,和NDK3类似。
这里使用了Application.mk,其作用是描述了应用程序需要哪些动态库和静态库。生成so文件方式一样,只要放在jni目录里面即可。注意:因为调用了某些库,不能在2.2一下的机器上运行。
5) OpenGL应用
Particletest的例子,通过OpenGl的接口,实现爆炸特效。
代码由羽化亲自修改真机上运行,没有任何问题,代码下载地址
http://download.csdn.net/source/3435189
下集预告:
Android Unity3D基础