五安卓原生API开发文档

得益于安卓原生应用API,从安卓API9级(安卓2.3,姜饼)开始,用纯原生代码编写安卓应用成为可能。也就是说,不需要一行Java代码。Android原生API定义在/platforms/android-/arch-arm/usr/include/android/文件夹下的几个头文件中。根据这些头文件中定义的函数所提供的功能,它们可以分为以下几类:

此外,安卓NDK还提供了一个名为的静态库,帮助创建和管理本地活动。这个库的源代码可以在sources/android/native_app_glue/目录下找到。

在本章中,我们将首先介绍使用native_acitivity.h提供的简单回调模型创建原生活动,以及原生appglue库启用的更复杂但更灵活的双线程模型。然后,我们将讨论安卓NDK的窗口管理,我们将从本地代码中在屏幕上绘制一些东西。接下来介绍输入事件处理和传感器访问。最后,我们将介绍资产管理,它管理我们项目的assets文件夹下的文件。请注意,本章中介绍的API可以用来完全摆脱Java代码,但我们不必这样做。安卓NDK公司的资产管理方法提供了一个在混合代码安卓项目中使用资产管理应用编程接口的例子。

在我们开始之前,重要的是要记住,尽管在本地活动中不需要Java代码,但安卓应用仍然在达尔维克虚拟机上运行,并且许多安卓平台功能都是通过JNI访问的。Android原生应用API只是为我们隐藏了Java世界。

Android原生应用API允许我们创建一个原生活动,这使得用纯原生代码编写Android应用成为可能。这个食谱介绍了如何用纯C/C++代码编写一个简单的安卓应用。

以下步骤创建一个简单的安卓NDK应用,无需一行Java代码:

在我们的例子中,我们创建了一个简单的“纯”本地应用,当安卓框架调用我们定义的回调函数时,它会输出日志。“纯”本机应用并不是真正的纯本机应用。虽然我们没有编写一行Java代码,但是Android框架仍然在DalvikVM上运行一些Java代码。

总之,NativeActivity是一个包装器,为我们的原生代码隐藏了托管的安卓Java世界,并公开了native_activity.h中定义的原生接口。

anativactivity数据结构:本机代码中的每个回调方法都接受一个ANativeActivity结构的实例。安卓NDK在native_acitivity.h中定义ANativeActivity数据结构如下:

typedefstructANativeActivity{structANativeActivityCallbacks*callbacks;JavaVM*vm;JNIEnv*env;jobjectclazz;constchar*internalDataPath;constchar*externalDataPath;int32_tsdkVersion;void*instance;AAssetManager*assetManager;}ANativeActivity;前面代码的各种属性解释如下:

native_activity.h接口提供了一个简单的单线程回调机制,允许我们在没有Java代码的情况下编写一个活动。然而,这种单线程方法意味着我们必须从我们的本机回调方法中快速返回。否则,应用将变得对用户动作没有响应(例如,当我们触摸屏幕或按下菜单按钮时,应用没有响应,因为图形用户界面线程正忙于执行回调功能)。

解决这个问题的一个方法是使用多线程。例如,许多游戏需要几秒钟才能加载。我们需要将加载卸载到一个后台线程,这样用户界面就可以显示加载进度并响应用户输入。安卓NDK自带一个名为android_native_app_glue的静态库,帮助我们处理此类案件。这个库的细节包含在使用安卓原生应用胶水配方创建原生活动中。

在Java活动中也存在类似的问题。例如,如果我们编写一个Java活动,在onCreate搜索整个设备的图片,应用将变得无响应。我们可以使用AsyncTask在后台搜索加载图片,让主UI线程显示一个进度条,响应用户输入。

前面的配方描述了native_activity.h中定义的接口如何允许我们创建本地活动。但是定义的所有回调都是用主UI线程调用的,这意味着我们不能在回调中做繁重的处理。

安卓SDK提供AsyncTask、Handler、Runnable、Thread等,帮助我们在后台处理事情,与主UI线程进行沟通。安卓NDK提供了一个名为android_native_app_glue的静态库,帮助我们在一个单独的线程中执行回调函数和处理用户输入。本食谱将详细讨论android_native_app_glue库。

android_native_app_glue库建立在native_activity.h界面之上。因此,建议读者先阅读用native_activity.h界面创建一个原生活动食谱,然后再阅读本书。

以下步骤基于android_native_app_glue库创建一个简单的安卓NDK应用:

本食谱演示了如何使用android_native_app_glue库创建本地活动。

使用android_native_app_glue库应遵循以下步骤:

在我们的例子中,我们实现了一个名为handle_activity_lifecycle_events的简单函数,并将android_app->onAppCmd函数指针指向它。该函数只打印cmd值和与android_app数据结构一起传递的用户数据。cmd在android_native_app_glue.h中定义为enum。比如app启动时,cmd值为10、11、0、1、6,分别对应APP_CMD_START、APP_CMD_RESUME、APP_CMD_INPUT_CHANGED、APP_CMD_INIT_WINDOW、APP_CMD_GAINED_FOCUS。

安卓_原生_app_glue库内部构件:库的源代码可以在安卓NDK的sources/android/native_app_glue文件夹下找到。它只由两个文件组成,即android_native_app_glue.c和android_native_app_glue.h。让我们首先描述代码的流程,然后详细讨论一些重要的方面。

由于提供了native_app_glue的源代码,我们可以在必要时修改它,尽管在大多数情况下没有必要。

android_native_app_glue建在native_activity.h界面的上面。如下图代码所示(摘自sources/android/native_app_glue/android_native_app_glue.c)。实现ANativeActivity_onCreate功能,在这里注册回调函数,调用android_app_create函数。请注意,返回的android_app实例由本机活动的instance字段指向,该字段可以传递给各种回调函数:

voidANativeActivity_onCreate(ANativeActivity*activity,void*savedState,size_tsavedStateSize){LOGV("Creating:%p\n",activity);activity->callbacks->onDestroy=onDestroy;activity->callbacks->onStart=onStart;activity->callbacks->onResume=onResume;……activity->callbacks->onNativeWindowCreated=onNativeWindowCreated;activity->callbacks->onNativeWindowDestroyed=onNativeWindowDestroyed;activity->callbacks->onInputQueueCreated=onInputQueueCreated;activity->callbacks->onInputQueueDestroyed=onInputQueueDestroyed;activity->instance=android_app_create(activity,savedState,savedStateSize);}android_app_create函数(如下代码片段所示)初始化android_app数据结构的一个实例,该数据结构在android_native_app_glue.h中定义。该函数为线程间通信创建一个单向管道。之后,它会生成一个新线程(我们称之为后台线程)来运行android_app_entry函数,并将初始化后的android_app数据作为输入参数。主线程将等待后台线程启动,然后返回:

staticvoid*android_app_entry(void*param){structandroid_app*android_app=(structandroid_app*)param;……//AttachlifecycleeventqueuewithidentifierLOOPER_ID_MAINandroid_app->cmdPollSource.id=LOOPER_ID_MAIN;android_app->cmdPollSource.app=android_app;android_app->cmdPollSource.process=process_cmd;android_app->inputPollSource.id=LOOPER_ID_INPUT;android_app->inputPollSource.app=android_app;android_app->inputPollSource.process=process_input;ALooper*looper=ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);ALooper_addFd(looper,android_app->msgread,LOOPER_ID_MAIN,ALOOPER_EVENT_INPUT,NULL,&android_app->cmdPollSource);android_app->looper=looper;pthread_mutex_lock(&android_app->mutex);android_app->running=1;pthread_cond_broadcast(&android_app->cond);pthread_mutex_unlock(&android_app->mutex);android_main(android_app);android_app_destroy(android_app);returnNULL;}下图显示了主线程和后台线程如何协同工作来创建多线程本地活动:

我们以活动生命周期事件队列为例。主线程调用回调函数,回调函数只是写入管道的写端,而在android_main函数中实现的真循环将轮询事件。一旦检测到事件,函数就调用事件处理程序,该程序从管道的读取端读取确切的命令并处理它。android_native_app_glue库为我们实现了所有的mainthread素材和部分backgroundthread素材。我们只需要提供轮询循环和事件处理程序,如示例代码所示。

管道:主线程通过调用pipe方法在android_app_create函数中创建一个单向管道。此方法接受两个整数的数组。函数返回后,第一个整数被设置为引用管道读端的文件描述符,第二个整数被设置为引用管道写端的文件描述符。

不同的操作系统对管道有不同的实现。安卓系统实现的管道是“半双工”,通信是单向的。也就是说,一个文件描述符只能写,另一个文件描述符只能读。某些操作系统中的管道是“全双工”的,其中两个文件描述符都可以读写。

Looper是一个事件跟踪工具,它允许我们为一个线程的事件循环附加一个或多个事件队列。每个事件队列都有一个关联的文件描述符。事件是文件描述符上可用的数据。为了使用活套,我们需要包含android/looper.h头文件。

该库为我们将在后台线程中创建的事件循环附加了两个事件队列,包括活动生命周期事件队列和输入事件队列。为了使用活套,应执行以下步骤:

本章前面的食谱提供了简单的例子,只有logcat输出。本食谱将讨论如何管理安卓NDK系统的原生窗口。

建议读者在阅读本书之前阅读以下食谱:

以下步骤创建示例应用:

执行以下步骤在手机屏幕上绘制一个正方形:

输入事件对于安卓应用中的用户交互至关重要。本食谱讨论如何在安卓NDK系统中检测和处理输入事件。

我们将进一步发展上一个食谱中的例子。请阅读在安卓NDK管理原生窗口食谱,然后再看这一个。

以下步骤创建一个示例应用,它在本机代码中检测和处理输入事件:

本食谱讨论了安卓NDK的android_native_app_glue库的输入事件处理。

Android_native_app_glue中的输入事件队列:android_native_app_glue默认为我们附加输入事件队列。

事件处理程序:在handle_input_events功能中,我们首先c调用AInputEvent_getType获取输入事件类型。android/input.h头文件定义了两种输入事件类型,即AINPUT_EVENT_TYPE_KEY和AINPUT_EVENT_TYPE_MOTION。第一种事件类型指示输入事件是按键事件,而第二种事件类型指示它是运动事件。

我们调用AKeyEvent_getAction、AKeyEvent_getFlags和AKeyEvent_getKeyCode来获取一个关键事件的动作、标志和关键代码,并打印一个字符串来描述它。另一方面,我们调用AMotionEvent_getAction和AMotionEvent_getX来获取动作事件的动作和x位置。请注意,AMotionEvent_getX函数需要第二个输入参数作为指针索引。指针索引通过使用以下代码获得:

pointer_index=(action&AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)>>AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;还有很多输入事件功能,可以在andoid/input.h找到。

许多安卓设备都内置了传感器来检测和测量运动、方向和其他环境条件。可以访问安卓NDK系统中的传感器。这个食谱将详细讨论如何做。

本配方中提供的示例基于前两个配方中的示例代码。建议读者先阅读:

以下步骤开发了示例安卓应用,演示了如何从安卓NDK系统访问传感器:

在我们的例子中,我们使用加速度传感器来检测手机抖动。然后,根据手机的晃动速度,我们将红色矩形移动到手机屏幕的一侧。一旦矩形到达手机屏幕的一个边缘,它就开始移动到另一个边缘。

示例代码提供了一个简单的算法来确定是否发生了晃动。存在更复杂和更精确的算法,并且可以实现。我们也可以调整SHAKE_TIMEOUT和SHAKE_COUNT_THRESHOLD常量来微调算法。

该示例的重要部分是如何访问传感器。我们来总结一下步骤:

资产为安卓应用提供了一种包含各种类型文件的方式,包括文本、图像、音频、视频等。本食谱讨论如何从安卓NDK系统加载资产文件。

以下步骤描述了示例应用的开发方式:

在示例中,我们从assets文件夹加载.png文件,并将其用作OpenGL纹理。您可以使用以下步骤将改为assets:

cppintAAsset_read(AAsset*asset,void*buf,size_tcount);

输入参数buf指的是读取后数据放置的位置,count表示我们要读取的字节数。实际读取的字节数是返回的,可能与count不同。

THE END
1.基于python的降美食菜谱分享网站微信小程序main_bp=Blueprint('main',__name__,static_folder='static')import_str='from . import 'view_tuple=set()exclude_list=[# "common.py","__init__.py"]dir=os.path.join(os.getcwd(),"api/main")dir=dir.replace("unit_test/",'')if"unit_test/"indirelsedirforiinos.listdir(dir):ifinotinhttps://blog.csdn.net/qq840612233/article/details/143882376
2.菜谱Excel表格模板菜谱Excel表格模板下载熊猫办公网站共为您提供42个菜谱设计素材以及精品菜谱Excel表格模板下载,汇集全球精品流行的菜谱Excel表格完整版模板,下载后直接替换文字图片即可使用,方便快捷的不二选择。https://m.tukuppt.com/excelmuban/caipumoban.html
3.厨师做的全部菜谱精选食谱全集从基础到高级探索厨艺之旅厨师做的全部菜谱,不仅仅是简单的食谱汇编,它更是一本通往美味之门的大辞典。每一道菜都隐藏着一个故事,每一种调料都承载着一个秘密。在这里,我们将带你走进这座由爱、技艺和创意构筑的城堡。 首先,让我们从基础开始。《厨师做的全部菜谱》中的“基础”不只是指简单几道熟悉的小吃,而是包含了各种基本烹饪技能https://www.dhrmkewmy.cn/cai-pu/353298.html
4.1号美食菜谱下载1号美食菜谱手机软件下载v5.1.11号美食菜谱是一款美食软件。我们可以使用这个软件来学习如何制作各种食物。如果你也热爱美食,喜欢做美食,可以下载这个软件。它将让您体验更多烹饪乐趣。 介绍: 做菜看菜谱,认准1号美食菜谱 健康食疗大全,宝宝辅食、孕妇餐、减肥餐、美容养颜餐!!! 菜谱、食谱、美食、养生餐、儿童餐专业的菜谱食谱APP 汇集了来自全国http://www.1666.com/az/v736355.html
5.食谱API自由和开放接口为了发展自己的降厨房APP应用什么时候健康厨房(cook.yi18.net)上线后,基于接口的须要,就非常快就完毕的食谱API接口的开发 文档地址:http://doc.yi18.net/cookapidoc 菜谱食谱API ,主要开放菜谱、食谱等相关的信息。打造一个健康厨房。 菜谱食谱大全的API路径BasePath (http://api.yi18.net/cook) https://www.cnblogs.com/gcczhongduan/p/4618967.html
6.菜谱大全菜谱大全API接口标准化API接口菜谱大全API,收录了蛋、奶制品、饼、面、蔬菜、水果、干果、肉类、水产等类别的十多万条菜谱数据,每日更新,可谓真正的菜谱(食谱)大全。https://www.juhe.cn/docs/api/id/46
7.菜谱大全API接口免费调用菜谱大全API可以查询菜谱的分类及菜名的具体信息。包含菜名、原料/配方、相关图片和制作流程。可按分类、关键词检索。本菜谱的信息来源于网络,所以本信息仅用于交流学习。此接口收录的有十万多条最新的菜谱。 三、API接口文档 1、请求地址 url:https://api.shumaidata.com/v10/menu/search https://www.shumaiapi.com/newsDetail/362
8.饭团菜谱下载2024安卓最新版手机app官方版免费安装下载6.强大的菜谱收藏功能,湘菜、川菜、粤菜、孕妇食谱、老人食谱,先收藏做菜不迷路;你是吃货吗?还为不会做饭发愁?饭团菜谱精选几十万道好吃的菜谱大全,汇聚了上万名美食UP主的推荐,囊括多国家上百种菜系分类,高清图片文字和在线视频,看不完的美食教学在线,学做饭更容易,小白轻松成长为大厨,和家人在厨房做菜共享天伦之https://m.wandoujia.com/apps/8283560
9.美食菜谱网站海量零失败家常菜 10000+VIP名厨菜谱 IOS:香哈菜谱大全 扫码下载APP IOS:香哈菜谱大全pro 扫码下载APP 安卓:食谱大全 扫码下载APP IOS:烘焙小屋 扫码下载APP 安卓:菜谱大全 扫码下载APPhttp://api.jiaonizuocai.com/
10.《命运2》官方食谱艾可拉似乎从来都没有休息过,即使是在曙光节即将到来的时候。我想出了一个小甜甜球的食谱,这样她也许就能在繁忙工作的间隙快速的享用上一道甜点。我觉得它们看起来就像是一个个的小旅行者——虽然它们比漂浮在高塔上空的那个完整一些。【现在已经修好啦~——译者】 https://api.xiaoheihe.cn/v3/bbs/app/api/web/share?link_id=51348234
11.香哈菜谱怎么发帖《香哈菜谱》发帖方法香哈菜谱是专为手机用户打造的菜谱APP,是一个美食交流社区以及丰富的美食知识学习平台。如果自己也有一些对于做菜烧菜的好方法,也可以发布帖子让更多的人看到,学习到哦。那么我们怎么发帖呢?下面小编也带来了详细的介绍。 1、打开,进入到香哈菜谱首页后,点击下方“我的”的按钮,然后点击写菜谱按钮。 https://m.liqucn.com/article/983118.wml
12.如何在uniapp中实现菜谱推荐和食谱分享uniapp随着人们对健康饮食的日益重视,获取菜谱推荐和分享食谱的需求也越来越高。在uniapp中,我们通过使用云开发、接口请求和组件等功能来实现菜谱推荐和食谱分享功能。本文将详细介绍如何在uniapp中实现这两个功能,并提供具体的代码示例。 一、菜谱推荐功能的实现 创建云开发数据库 在uniapp项目中,我们首先需要创建一个云开发https://m.php.cn/faq/622643.html
13.GitHub4、卡路里累加器及其可视化、每天个人信息可视化 5、https://www.xinshipu.com/菜谱信息 6、通过照片提取出食物的卡路里等信息 百度api 7、http://www.zyyssl.com/cookbook.html//中药食材信息、药膳信息、9体、各种病针对的药膳 8、照片识菜帮 9、http://www.ttmeishi.com/CaiXi/YaoShan///病人对应的食谱https://github.com/guguji/NutritionMaster
14.明日之后烹饪食谱大全食物菜谱配方一览明日之后在最新的测试中大大完善了烹饪的玩法,玩家可以通过食谱制造出各种效果不同的食物,今天小编就带来了明日之后烹饪食谱大全,介绍一下各食物的菜谱配方,感兴趣的玩家赶紧了解一下吧。 食谱配方大全 图鉴 名称 作用 食材 果酱 充饥 水果 蒸烤蔬菜 充饥 蔬菜 https://www.18183.com/dhsurvive/201811/1333401.html?api=clear
15.免费家常菜做法大全app免费家常菜做法大全软件2024新版下载菜谱、食谱、美食、养生餐、儿童餐就找免费家常菜做法大全——专业的菜谱、食谱APP食谱大全,收录了全球各地的名菜和美食做法。汇聚了国内全面、细致、精美的各类懒人食谱!一应俱全,全部经过全国各地吃货们的亲自验证,就是靠谱!让您成为食神指日可待。1万多道原创视频食谱,家常菜、西餐、烘焙食谱都很全,每道菜为你https://m.iuuu9.com/app/hw.mfjcczfdq
16.烧排焖瓜皮的做法热菜菜谱菜谱烧排焖瓜皮 - 中文美食家常菜谱图解大全https://shipu.bmcx.com/shaopaimenguapi__shipuchaxun/
17.菜谱推荐系统食谱推荐系统外卖推荐系统大数据毕业设计计算机毕业设计之PyTroch+Spark+LSTM美食推荐系统 食谱推荐系统 订餐推荐系统 菜谱推荐系统 食谱推荐系统 外卖推荐系统 大数据毕业设计 开发技术 前端:vue.js、echarts、websocket 后端API:springboot+mybatis-plus 数据库:mysql 数据分析:Spark 机器学习:PyTroch(基于神经网络的混合CF推荐算法)、协同过滤算法(基于用户、https://www.jianshu.com/p/9bce5d0a6809
18.饥荒联机版饥荒中文破解版下载附攻略在游戏中,随着大厨沃利的更新,也带来了新的菜谱,菜谱分为大众(普通锅)和沃利(厨师锅)专属两种。今天就来一起看看普通锅子也可以烹饪的食谱吧1、奶油土豆泥奶油土豆泥由3个土豆和1个大蒜制作而成,比较适合用于回san值2、芦笋汤2个蔬菜和2个芦笋即可做出芦笋汤,当然想要减低芦笋的使用量,可以尝试1个芦笋和3个https://www.23mc.com/pc-software/123042.html
19.卷王都在用!100款宝藏级AIGC工具分享,强烈建议收藏(2)生活类,包括“会放飞的菜谱”、“小学生作文”、“然后呢”三种应用; (3)娱乐类,包括“彩虹屁专家”、“写情书”和“为你写诗”三种应用。 目前,通义千问主要功能包括文案创作、对话聊天、知识问答、逻辑推理、代码编写、文本摘要以及图像视频理解服务。 https://www.cyzone.cn/article/731603.html
20.卷王都在用!100款宝藏级AIGC工具分享,强烈建议收藏!!(2)生活类,包括“会放飞的菜谱”、“小学生作文”、“然后呢”三种应用;(3)娱乐类,包括“彩虹屁专家”、“写情书”和“为你写诗”三种应用。目前,通义千问主要功能包括文案创作、对话聊天、知识问答、逻辑推理、代码编写、文本摘要以及图像视频理解服务。https://www.changbiyuan.cn/news/2023/news_0711/69335.html
21.菜谱大全小程序应用开发制作方案合肥微信小程序开发公司合肥接下来,关于功能模块的构建,菜谱大全小程序应当包含以下核心功能:一是食谱浏览与搜索;二是用户上传与分享自己的烹饪经验;三是社区互动,包括评论、点赞和收藏等社交元素。这些功能不仅能够满足用户的日常需求,还能够促进用户之间的交流与互动。例如,用户可以轻松地查找并尝试各种不同的菜谱,同时也能将自己的作品上传至平http://www.roadke.com/3082.html
22.下载美食菜谱大全美食菜谱大全App下载安装安卓版v3.2.0fetch("https://m.mckuai.com/api/appshow_mip?id=77456").then(function (res) { return res.json(); }).then(function (data) { let status = data.status; if(status==1){ let tit = "下载美食菜谱大全_美食菜谱大全App下载安装安卓版v3.2.0【暂无资源】-麦块安卓网"; MIP.setData({isBao:1https://m.mckuai.com/mip/app/77456.html
23.孕妇营养菜谱孕妇营养菜谱 我老婆怀孕了,这眼看夏天就要来了,以前老婆夏天的时候就经常没有食欲不好好吃饭,可是她现在怀了小宝宝,我想咨询一下专家有没有什么好的食谱建议? 赵艳忠主任医师 首都医科大学附属复兴医院妇科 我要问专家 豆腐皮粥 原料:豆腐皮2张,粳米10克,冰糖150克,清水l0oo克。 做法:豆腐皮用水洗净,切成小https://m.chaonei.com/qa_1479148