1、android=package=com.example.native_activityandroid:versionCode=1versionName=- This is the platform API where NativeActivity was introduced. - 本地活动将引入的平台 API -uses-sdk android:minSdkVersion=8 /- This .apk has no Java code itself, so set hasCode to false. - 该 .apk 没有 Java 代码,所以设置 hasCode 属性值为假 -applic
2、ation android:label=string/app_namehasCode=false- Our activity is the built-in NativeActivity framework class.This will take care of integrating with our NDK code. - 我们的活动是内置本地活动框架类。这将处理使我们的 NDK 代码成为一体。 -activity android:name=android.app.NativeActivityconfigChanges=orientation|keyboardHidden- Tell N
3、ativeActivity the name of or .so - 告知本地活动共享库的名字 -meta-data android:android.app.lib_namevalue=native-activityintent-filteraction android:android.intent.action.MAINcategory android:android.intent.category.LAUNCHER/intent-filter/activity/application/manifest- END_INCLUDE(manifest) -三、native-activity/re
4、s/values/strings.xml 文件内容: encoding=resourcesstring name=app_nameNativeActivity/resources四、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) 2010 The Android Open Sou
5、rce Project# 版权所有(C)2010 Android 开源工程# Licensed under the Apache License, Version 2.0 (the License);# 根据 2.0 版本 Apache 许可证授权# you may not use this file except in compliance with the License.# 根据本许可证,你可以不使用此文件。# You may obtain a copy of the License at# 你可以获得许可证的副本在# http:/www.apache.org/licenses/LICE
6、NSE-2.0# Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an AS IS BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# 除非因适用法律需要或书面同意,# 根据许可证分发的软件是基于按原样原则提供,无任何明示的或暗示的保证或条件。# See the License for the spe
7、cific language governing permissions and# limitations under the License.# 详见根据许可证许可下,特定语言的管辖权限和限制。# 用于返回当前目录的路径LOCAL_PATH := $(call my-dir)# CLEAR_VARS 变量是由生成系统已提供的,# 并且指出一个特殊的 GNU Makefile 文件将为你清除除了 LOCAL_PATH 以外的许多的 LOCAL_XXX 变量,# (例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES,等等.)# 这是必
8、须的,因为全部的生成控制文件是在一个单独的 GNU Make 执行环境中被分析的,在那里所有的变量是全局的。include $(CLEAR_VARS)# LOCAL_MODULE 变量必须是已定义的,用来标识你的 Android.mk 文件中描述的每个模块。# 模块名字必须是唯一,并且不能包含任何的空格。# 注意生成系统将自动添加适当的前缀和后缀到相应的产生文件。# 换句话说,一个共享库模块命名为 native-activity 将产生 libnative-activity.so 。LOCAL_MODULE := native-activity# LOCAL_SRC_FILES 变量必须包含将
9、生成且汇编成一个模块的 C 和/或 C+ 源文件的列表。# 注意你将不列出头文件和包含文件在这里,因为生成系统将自动地为你估算依赖;# 列出的源文件将直接递给编译器。LOCAL_SRC_FILES := main.c# 使用在生成你的模块时的额外的链接器标志列表。# 对于用 -l 前缀传递特定的系统库名是有用的。# liblog.so 提供 Android 记录日志 API# libandroid.so 提供 Android 功能访问 API# libEGL.so 提供 EGL API# libGLESv1_CM.so 提供 OpenGL ES API# 注:# OpenGL ES (Open
10、GL for Embedded Systems,以下简称 OpenGL)# OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。# 该 API 由 Khronos 集团定义推广,# Khronos 是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。# EGL 是 OpenGL ES 和 底层本地平台视窗系统 之间的接口,为 OpenGL ES 提供平台独立性而设计。# 它被用于处理图形管理、表面/缓冲捆绑、渲染同步,# 以及支援使用其他 Khronos API 进行的高效、加速、混合模式 2D 和 3D 渲染。LOCAL_LDLIBS :=
11、-llog -landroid -lEGL -lGLESv1_CM# 将链接到本模块的静态库模块列表(用 BUILD_STATIC_LIBRARY 生成的)。# 这仅在共享库模块中有意义。LOCAL_STATIC_LIBRARIES := android_native_app_glue# BUILD_SHARED_LIBRARY 是一个已由生成系统提供的变量,# 表明一个 GNU Makefile 脚本是负责收集你定义的从最近的 include $(CLEAR_VARS)# 到决定去生成之间的全部 LOCAL_XXX 变量的信息,然后正确地生成共享库。# 注意你必须在包含这个文件之前最近位置有
12、 LOCAL_MODULE 或 LOCAL_SRC_FILES 变量的定义。include $(BUILD_SHARED_LIBRARY)# $(call macro-name, param1, .)# call 是一个内置于 make 的函数,# call 会扩展它的第一个参数并把其余参数依次替换到出现 $1、$2、.的地方。# call 的第一个参数可以是任何宏或变量的名称。# 允许你通过名字查找且包含其它模块的 Android.mk 文件。# 这将在你的 NDK_MODULE_PATH 环境变量提到的目录列表中查找模块标记的名字,# 并自动地为你包含它的 Android.mk 文件。#
13、为了方便起见,$NDK/sources 是被 NDK 生成系统附加到你的 NDK_MODULE_PATH 变量值定义中。$(call import-module,android/native_app_glue)六、native-activity/jni/main.c 文件内容:/* Copyright (C) 2010 The Android Open Source Project* 版权所有(C)2010 Android 开源工程* Licensed under the Apache License, Version 2.0 (the * 根据 2.0 版本 Apache 许可证授权* yo
14、u may not use this file except in compliance with the License.* 根据本许可证,你可以不使用此文件。* You may obtain a copy of the License at* 你可以获得许可证的副本在* http:* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an * WITHOUT WARRANTIES OR CONDITIONS
15、OF ANY KIND, either express or implied.* 除非因适用法律需要或书面同意,* 根据许可证分发的软件是基于* See the License for the specific language governing permissions and* limitations under the License.*/BEGIN_INCLUDE(all)/* Java Native Interface */#include /* 错误报告机制 */errno.h/* EGL */EGL/egl.h/* OpenGL ES 1.x */GLES/gl.h/* 接收和处
16、理传感器事件 */android/sensor.h/* Android logging API */android/log.h/* android-ndk-r5b/sources/android/native_app_glue 静态库头文件 */android_native_app_glue.h#define LOGI(.) (void)_android_log_print( ANDROID_LOG_INFO, , _VA_ARGS_ )#define LOGW(.) (void)_android_log_print( ANDROID_LOG_WARN, /* Our saved state
17、data.* 我们已保存的状态数据。struct saved_statefloat angle; /* RGB 中的绿色值 */int32_t x; /* X 坐标 */int32_t y; /* Y 坐标 */;* Shared state for our app.* 为我们的应用程序共享状态。struct engine/* android_native_app_glue.h 中定义的本地应用程序粘合剂模块用数据结构 */struct android_app* app;/* sensor.h 中定义的传感器管理器 */ASensorManager* sensorManager;/* 加速度传
18、感器 */const ASensor* accelerometerSensor;/* 已与一个循环器关联起来的传感器事件队列 */ASensorEventQueue* sensorEventQueue;/* 非零为可以绘制动画 */int animating;/* 显示器句柄 */EGLDisplay display;/* 系统窗口或 frame buffer 句柄 */EGLSurface surface;/* OpenGL ES 图形上下文 */EGLContext context;/* 系统窗口的宽度(像素) */int32_t width;int32_t height;/* 我们已保存
19、的状态数据 */struct saved_state state;* Initialize an EGL context for the current display.* 为当前显示器初始化一个 EGL 上下文。static intengine_init_display( struct engine* engine )/* initialize OpenGL ES and EGL* 初始化 OpenGL ES 和 EGL* Here specify the attributes of the desired configuration.* 在这里具体指定想要的配置的属性。* Below, w
20、e select an EGLConfig with at least 8 bits per color* component compatible with on-screen windows.* 在下面,我们选择一个至少 8 位色的 EGLConfig 与屏幕上的窗口一致。* 注:通常以 ID, Value 依次存放,对于个别标识性的属性可以只有 ID 没有 Value 。const EGLintattribs = EGL_SURFACE_TYPE, EGL_WINDOW_BIT, /* 系统窗口类型 */EGL_BLUE_SIZE, 8, /* 蓝色位数 */EGL_GREEN_SIZE
21、, 8, /* 绿色位数 */EGL_RED_SIZE, 8, /* 红色位数 */EGL_NONE ;EGLint w;/* 系统窗口的高度(像素) */EGLint h;/* 未使用的变量 */EGLint dummy;/* 像素格式ID - RGBA/RGBX/RGB565 */EGLint format;/* 系统中 Surface 的 EGL 配置 的总个数 */EGLint numConfigs;/* Surface 的 EGL 配置 */EGLConfig config;/* 系统窗口句柄 */* 1.返回一个显示器连接 - 是一个关联系统物理屏幕的通用数据类型。 */EGLDi
22、splay display = eglGetDisplay( EGL_DEFAULT_DISPLAY ); /* 得到系统默认的 */* 原型:EGLDisplay eglGetDisplay ( NativeDisplayType display );* display 参数是本地系统显示器类型,取值为本地显示器 ID 值。* 返回:如果系统中没有一个可用的本地显示器 ID 值与 display 参数匹配,* 函数将返回 EGL_NO_DISPLAY ,而没有任何 Error 状态被设置。/* 2. EGL 在使用前需要初始化,因此每个显示器句柄(EGLDisplay)在使用前都需要初始化。
23、eglInitialize( display, /* 有效的显示器句柄 */0, /* 返回主版本号 - 不关心可设为 NULL 值或零(0) */0 ); /* 返回次版本号 - 不关心可设为 NULL 值或零(0) */EGLBoolean eglInitialize( EGLDisplay dpy,* EGLint* major,* EGLint* minor );* EGLint 为 int 数据类型。EGLBOOlean 取值:EGL_TRUE = 1, EGL_FALSE = 0 。/* Here, the application chooses the configuration
24、 it desires.* 在这里,应用程序决定它要求的配置。* In this sample, we have a very simplified selection process,* where we pick the first EGLConfig that matches our criteria.* 在这个示例中,我们有一个非常精简的选择处理,* 我们选择第一个 EGLConfig 适应我们的标准。/* 定义一个希望从系统获得的配置,它将返回一个最接近你的需求的配置 */eglChooseConfig( display, /* 有效的显示器句柄 */attribs, /* 以 EG
25、L_NONE 结束的参数数组 */&config, /* Surface 的 EGL 配置 */1, /* Surface 的 EGL 配置个数 */numConfigs ); /* 系统中 Surface 的 EGL 配置 的总个数 */EGLboolean eglChooseConfig( EGLDisplay dpy,* const EGLint* attr_list,* EGLConfig* config,* EGLint config_size,* EGLint* num_config );/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig* that is guaranteed to be accepted by ANativeWindow_setBuffersGeometry().* EGL_NATIVE_VISUAL_ID 是一个 EGLConfig 的属性,* 保证被 ANativeWindow_setBuffersGeometry 函数认可。* As soon as we picked a EGLConfig,* we can safely reconfigure the A
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1