name="android.intent.category.LAUNCHER"/>
--END_INCLUDE(manifest)-->
三、native-activity/res/values/strings.xml文件内容:
xmlversion="1.0"encoding="utf-8"?
>
NativeActivity
四、native-activity/jni/Application.mk文件内容:
#使用android-ndk-r5b/platforms/android-9/arch-arm/usr目录下的头文件与库文件
APP_PLATFORM:
=android-9
五、native-activity/jni/Android.mk文件内容:
#Copyright(C)2010TheAndroidOpenSourceProject
#版权所有(C)2010Android开源工程
#
#LicensedundertheApacheLicense,Version2.0(the"License");
#根据2.0版本Apache许可证授权
#youmaynotusethisfileexceptincompliancewiththeLicense.
#根据本许可证,你可以不使用此文件。
#YoumayobtainacopyoftheLicenseat
#你可以获得许可证的副本在
#
#http:
//www.apache.org/licenses/LICENSE-2.0
#
#Unlessrequiredbyapplicablelaworagreedtoinwriting,software
#distributedundertheLicenseisdistributedonan"ASIS"BASIS,
#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
#除非因适用法律需要或书面同意,
#根据许可证分发的软件是基于"按原样"原则提供,无任何明示的或暗示的保证或条件。
#SeetheLicenseforthespecificlanguagegoverningpermissionsand
#limitationsundertheLicense.
#详见根据许可证许可下,特定语言的管辖权限和限制。
#用于返回当前目录的路径
LOCAL_PATH:
=$(callmy-dir)
#CLEAR_VARS变量是由生成系统已提供的,
#并且指出一个特殊的GNUMakefile文件将为你清除除了LOCAL_PATH以外的许多的LOCAL_XXX变量,
#(例如:
LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等等...)
#这是必须的,因为全部的生成控制文件是在一个单独的GNUMake执行环境中被分析的,在那里所有的变量是全局的。
include$(CLEAR_VARS)
#LOCAL_MODULE变量必须是已定义的,用来标识你的Android.mk文件中描述的每个模块。
#模块名字必须是唯一,并且不能包含任何的空格。
#注意生成系统将自动添加适当的前缀和后缀到相应的产生文件。
#换句话说,一个共享库模块命名为native-activity将产生libnative-activity.so。
LOCAL_MODULE:
=native-activity
#LOCAL_SRC_FILES变量必须包含将生成且汇编成一个模块的C和/或C++源文件的列表。
#注意你将不列出头文件和包含文件在这里,因为生成系统将自动地为你估算依赖;
#列出的源文件将直接递给编译器。
LOCAL_SRC_FILES:
=main.c
#使用在生成你的模块时的额外的链接器标志列表。
#对于用-l前缀传递特定的系统库名是有用的。
#liblog.so提供Android记录日志API
#libandroid.so提供Android功能访问API
#libEGL.so提供EGLAPI
#libGLESv1_CM.so提供OpenGLESAPI
#注:
#OpenGLES(OpenGLforEmbeddedSystems,以下简称OpenGL)
#OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
#该API由Khronos集团定义推广,
#Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。
#
#EGL是OpenGLES和底层本地平台视窗系统之间的接口,为OpenGLES提供平台独立性而设计。
#它被用于处理图形管理、表面/缓冲捆绑、渲染同步,
#以及支援使用其他KhronosAPI进行的高效、加速、混合模式2D和3D渲染。
LOCAL_LDLIBS:
=-llog-landroid-lEGL-lGLESv1_CM
#将链接到本模块的静态库模块列表(用BUILD_STATIC_LIBRARY生成的)。
#这仅在共享库模块中有意义。
LOCAL_STATIC_LIBRARIES:
=android_native_app_glue
#BUILD_SHARED_LIBRARY是一个已由生成系统提供的变量,
#表明一个GNUMakefile脚本是负责收集你定义的从最近的include$(CLEAR_VARS)
#到决定去生成之间的全部LOCAL_XXX变量的信息,然后正确地生成共享库。
#注意你必须在包含这个文件之前最近位置有LOCAL_MODULE或LOCAL_SRC_FILES变量的定义。
include$(BUILD_SHARED_LIBRARY)
#$(callmacro-name[,param1,...])
#call是一个内置于make的函数,
#call会扩展它的第一个参数并把其余参数依次替换到出现$1、$2、...的地方。
#call的第一个参数可以是任何宏或变量的名称。
#允许你通过名字查找且包含其它模块的Android.mk文件。
#这将在你的NDK_MODULE_PATH环境变量提到的目录列表中查找模块标记的名字,
#并自动地为你包含它的Android.mk文件。
#为了方便起见,$NDK/sources是被NDK生成系统附加到你的NDK_MODULE_PATH变量值定义中。
$(callimport-module,android/native_app_glue)
六、native-activity/jni/main.c文件内容:
/*
*Copyright(C)2010TheAndroidOpenSourceProject
*版权所有(C)2010Android开源工程
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*根据2.0版本Apache许可证授权
*youmaynotusethisfileexceptincompliancewiththeLicense.
*根据本许可证,你可以不使用此文件。
*YoumayobtainacopyoftheLicenseat
*你可以获得许可证的副本在
*
*http:
//www.apache.org/licenses/LICENSE-2.0
*
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*除非因适用法律需要或书面同意,
*根据许可证分发的软件是基于"按原样"原则提供,无任何明示的或暗示的保证或条件。
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*根据许可证分发的软件是基于"按原样"原则提供,无任何明示的或暗示的保证或条件。
*/
//BEGIN_INCLUDE(all)
/*JavaNativeInterface*/
#include
/*错误报告机制*/
#include
/*EGL*/
#include
/*OpenGLES1.x*/
#include
/*接收和处理传感器事件*/
#include
/*AndroidloggingAPI*/
#include
/*android-ndk-r5b/sources/android/native_app_glue静态库头文件*/
#include
#defineLOGI(...)\
((void)__android_log_print(ANDROID_LOG_INFO,"native-activity",__VA_ARGS__))
#defineLOGW(...)\
((void)__android_log_print(ANDROID_LOG_WARN,"native-activity",__VA_ARGS__))
/**
*Oursavedstatedata.
*我们已保存的状态数据。
*/
structsaved_state
{
floatangle;/*RGB中的绿色值*/
int32_tx;/*X坐标*/
int32_ty;/*Y坐标*/
};
/**
*Sharedstateforourapp.
*为我们的应用程序共享状态。
*/
structengine
{
/*android_native_app_glue.h中定义的本地应用程序粘合剂模块用数据结构*/
structandroid_app*app;
/*sensor.h中定义的传感器管理器*/
ASensorManager*sensorManager;
/*加速度传感器*/
constASensor*accelerometerSensor;
/*已与一个循环器关联起来的传感器事件队列*/
ASensorEventQueue*sensorEventQueue;
/*非零为可以绘制动画*/
intanimating;
/*显示器句柄*/
EGLDisplaydisplay;
/*系统窗口或framebuffer句柄*/
EGLSurfacesurface;
/*OpenGLES图形上下文*/
EGLContextcontext;
/*系统窗口的宽度(像素)*/
int32_twidth;
/*系统窗口的宽度(像素)*/
int32_theight;
/*我们已保存的状态数据*/
structsaved_statestate;
};
/**
*InitializeanEGLcontextforthecurrentdisplay.
*为当前显示器初始化一个EGL上下文。
*/
staticint
engine_init_display(structengine*engine)
{
/*initializeOpenGLESandEGL
*初始化OpenGLES和EGL
*/
/*
*Herespecifytheattributesofthedesiredconfiguration.
*在这里具体指定想要的配置的属性。
*
*Below,weselectanEGLConfigwithatleast8bitspercolor
*componentcompatiblewithon-screenwindows.
*在下面,我们选择一个至少8位色的EGLConfig与屏幕上的窗口一致。
*注:
通常以ID,Value依次存放,对于个别标识性的属性可以只有ID没有Value。
*/
constEGLint
attribs[]={EGL_SURFACE_TYPE,EGL_WINDOW_BIT,/*系统窗口类型*/
EGL_BLUE_SIZE,8,/*蓝色位数*/
EGL_GREEN_SIZE,8,/*绿色位数*/
EGL_RED_SIZE,8,/*红色位数*/
EGL_NONE};
/*系统窗口的宽度(像素)*/
EGLintw;
/*系统窗口的高度(像素)*/
EGLinth;
/*未使用的变量*/
EGLintdummy;
/*像素格式ID-RGBA/RGBX/RGB565*/
EGLintformat;
/*系统中Surface的EGL配置的总个数*/
EGLintnumConfigs;
/*Surface的EGL配置*/
EGLConfigconfig;
/*系统窗口句柄*/
EGLSurfacesurface;
/*OpenGLES图形上下文*/
EGLContextcontext;
/*1.返回一个显示器连接-是一个关联系统物理屏幕的通用数据类型。
*/
EGLDisplaydisplay=eglGetDisplay(EGL_DEFAULT_DISPLAY);/*得到系统默认的*/
/*原型:
EGLDisplayeglGetDisplay(NativeDisplayTypedisplay);
* display参数是本地系统显示器类型,取值为本地显示器ID值。
*返回:
如果系统中没有一个可用的本地显示器ID值与display参数匹配,
* 函数将返回EGL_NO_DISPLAY,而没有任何Error状态被设置。
*/
/*2.EGL在使用前需要初始化,因此每个显示器句柄(EGLDisplay)在使用前都需要初始化。
*/
eglInitialize(display,/*有效的显示器句柄*/
0,/*返回主版本号-不关心可设为NULL值或零(0)*/
0);/*返回次版本号-不关心可设为NULL值或零(0)*/
/*原型:
EGLBooleaneglInitialize(EGLDisplaydpy,
*EGLint*major,
*EGLint*minor);
* EGLint为int数据类型。
*返回:
EGLBOOlean取值:
EGL_TRUE=1,EGL_FALSE=0。
*/
/*Here,theapplicationchoosestheconfigurationitdesires.
*在这里,应用程序决定它要求的配置。
*
*Inthissample,wehaveaverysimplifiedselectionprocess,
*wherewepickthefirstEGLConfigthatmatchesourcriteria.
*在这个示例中,我们有一个非常精简的选择处理,
*我们选择第一个EGLConfig适应我们的标准。
*/
/*定义一个希望从系统获得的配置,它将返回一个最接近你的需求的配置*/
eglChooseConfig(display,/*有效的显示器句柄*/
attribs,/*以EGL_NONE结束的参数数组*/
&config,/*Surface的EGL配置*/
1,/*Surface的EGL配置个数*/
&numConfigs);/*系统中Surface的EGL配置的总个数*/
/*原型:
EGLbooleaneglChooseConfig(EGLDisplaydpy,
*constEGLint*attr_list,
*EGLConfig*config,
*EGLintconfig_size,
*EGLint*num_config);
*/
/*EGL_NATIVE_VISUAL_IDisanattributeoftheEGLConfig
*thatisguaranteedtobeacceptedbyANativeWindow_setBuffersGeometry().
*EGL_NATIVE_VISUAL_ID是一个EGLConfig的属性,
*保证被ANativeWindow_setBuffersGeometry函数认可。
*
*AssoonaswepickedaEGLConfig,
*wecansafelyreconfiguretheA