Android NDK开发详解之JNI中的库文件

Android NDK开发详解之JNI中的库文件

      • 简介
      • 工作原理
      • 流程
      • 原生 activity 和应用

简介

本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:

    在平台之间移植其应用。重复使用现有库,或者提供其自己的库供重复使用。在特定情况下提高性能,特别是像游戏这种计算密集型应用。

工作原理

本部分介绍了在为 Android 构建原生应用时使用的主要组件,并且介绍了构建和封装过程。
主要组件

在构建应用时,您应该已经了解以下组件:

    原生共享库:NDK 从 C/C++ 源代码构建这些库或 .so 文件。原生静态库:NDK 也可构建静态库或 .a 文件,而您可将静态库关联到其他库。Java 原生接口 (JNI):JNI 是 Java 和 C++ 组件用于相互通信的接口。本指南假设您具备 JNI 知识;如需了解相关信息,请查阅 Java 原生接口规范。应用二进制接口 (ABI):ABI 可以非常精确地定义应用的机器代码在运行时应该如何与系统交互。NDK 根据这些定义构建 .so 文件。不同的 ABI 对应不同的架构:NDK 为 32 位 ARM、AArch64、x86 及 x86-64 提供 ABI 支持。如需了解详情,请参阅 Android ABI。清单:如果您编写的应用不包含 Java 组件,必须在清单中声明 NativeActivity 类。要详细了解如何执行此操作,请参阅使用 native_activity.h 接口。

流程

为 Android 开发原生应用的一般流程如下:

  设计应用,确定要使用 Java 实现的部分,以及要以原生代码形式实现的部分。注意:虽然可以完全避免使用 Java,但您可能会发现 Android Java 框架对于控制显示和界面等任务很有用。像创建任何其他 Android 项目一样创建一个 Android 应用项目。如果要编写纯原生应用,请在 AndroidManifest.xml 中声明 NativeActivity 类。如需了解详情,请参阅原生 activity 和应用。在“JNI”目录中创建一个描述原生库(包括名称、标记、关联库和要编译的源文件)的 Android.mk 文件。或者,您也可以创建一个配置目标 ABI、工具链、发布/调试模式和 STL 的 Application.mk 文件。对于其中任何您未指明的项,将分别使用以下默认值:ABI:所有非弃用的 ABI模式:发布STL:系统将原生源代码放在项目的 jni 目录下。使用 ndk-build 编译原生(.so、.a)库。构建 Java 组件,生成可执行 .dex 文件。将所有内容封装到一个 APK 文件中,包括 .so、.dex 以及应用运行所需的其他文件。

原生 activity 和应用

Android SDK 提供了辅助类 NativeActivity,可用于编写完全原生的 activity。NativeActivity 可处理 Android 框架与原生代码之间的通信,因此您不必子类化该类或调用其方法,而只需在 AndroidManifest.xml 文件中将您的应用声明为原生应用,然后开始创建该原生应用。

使用 NativeActivity 的 Android 应用仍会在其自己的虚拟机中运行,与其他应用以沙盒的形式分隔。因此,您仍可通过 JNI 访问 Android 框架 API。在某些情况下(例如对于传感器、输入事件和资源),NDK 提供可使用的原生接口,而无需通过 JNI 调用。如需详细了解此类支持,请参阅原生 API。

无论是否要开发原生 activity,我们都建议使用传统 Android 构建工具创建项目。这样有助于确保使用正确的结构构建和封装 Android 应用。

Android NDK 为实现原生 activity 提供两个选项:

    native_activity.h 头文件会定义 NativeActivity 类的原生版本。其中包含创建原生 activity 所需的回调接口和数据结构。由于应用的主线程会处理回调,因此回调实现不能阻止主线程,否则可能会收到 ANR(应用无响应)错误,因为主线程在回调返回之前无响应。android_native_app_glue.h 文件会定义基于 native_activity.h 接口构建的静态辅助库。它会派生出另一个线程,用于处理事件循环中的回调或输入事件等。将这些事件移至单独的线程可防止任何回调阻止主线程。

此外,<ndk_root>/sources/android/native_app_glue/android_native_app_glue.c 源代码也可供使用,使您能够修改实现。

如需详细了解如何使用此静态库,请查看原生 activity 示例应用及其文档。<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h 文件中的注释提供了更多其他信息。
使用 native_activity.h 接口

要使用 native_activity.h 接口实现原生 activity,请执行以下操作:

在项目的根目录中创建一个 jni/ 目录。此目录用于存储所有原生代码。在 AndroidManifest.xml 文件中声明原生 activity。由于您的应用没有 Java 代码,因此请将 android:hasCode 设为 false。
<application android:label="@string/app_name" android:hasCode="false">

您必须将 activity 标记的 android:name 属性设置为 NativeActivity。

<activity android:name="android.app.NativeActivity"android:label="@string/app_name">

注意:您可以子类化 NativeActivity。如果子类化该类,请使用子类的名称,而不是 NativeActivity。

meta-data 标记的 android:value 属性会指定共享库的名称,其中包含应用的入口点(例如 C/C++ main),省略库名的 lib 前缀和 .so 后缀。


<manifest><application><activity><meta-data android:name="android.app.lib_name"android:value="native-activity" /><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

创建用于原生 activity 的文件,并实现 ANativeActivity_onCreate 变量中指定的函数。应用在原生 activity 启动时会调用此函数。此函数类似于 C/C++ 中的 main,它会接收 ANativeActivity 结构的指针,其中包含您需要编写的各个回调实现的函数指针。在 ANativeActivity->callbacks 中设置回调实现的适用回调函数指针。

将 ANativeActivity->instance 字段设置为您要使用的特定数据的任何实例的地址。

实现您希望 activity 在启动时执行的任何其他操作。

实现您在 ANativeActivity->callbacks 中设置的其余回调。如需详细了解何时调用回调,请参阅管理 activity 生命周期。

开发应用的其余部分。

在项目的 jni/ 目录中创建 Android.mk file,向构建系统描述您的原生模块。如需了解详情,请参阅 Android.mk。

创建 Android.mk 文件后,使用 ndk-build 命令编译原生代码。


cd <path>/<to>/<project>
$NDK/ndk-build

像平常一样构建和安装 Android 项目。如果原生代码存放在 jni/ 目录中,构建脚本会自动将从原生代码构建的 .so 文件封装到 APK 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML External Entity-XXE-XML实体注入

XML 实体? XML 实体允许定义标签,在解析 XML 文档时这些标签将被内容替换。一般来说,实体分为三种类型: 内部实体 外部实体 参数实体。 必须在文档类型定义(DTD)中创建实体 一旦 XML 文档被解析器处理,它将js用定义的常量“Jo Smith”替换定义的实体。正如您所看到…

获取Webshell方法

CMS系统指的是内容管理系统。已经有别人开发好了整个网站的前后端&#xff0c;使用者只需要部署cms&#xff0c;然后通过后台添加数据&#xff0c;修改图片等工作&#xff0c;就能搭建好一个的WEB系统。 CMS获取Webshell方法 WordPress后台拿Webshell phpcms拿Webshell 非CMS…

IDEA优雅自动生成类注释和快捷键生成方法注释

生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板&#xff1a; /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…

企业如何在自媒体平台推广

自媒体是企业宣传品牌的平台之一&#xff0c;在自媒体平台上企业能够较为自由的决定文案内容发布时间&#xff0c;同时后台也会有专门的数据分析帮助企业了解每一次推广效果&#xff0c;成本可控、数据可查、效果可追踪&#xff0c;还能与用户或者潜在用户互动&#xff0c;进行…

C#学习系列之密闭类、接口、结构和类

C#学习系列之密闭类、接口、结构和类 啰嗦密闭类接口结构和类总结 啰嗦 基础学习 密闭类 类似string这种不想再继续继承和修改下去&#xff0c;使用sealed声明。 派生类中用sealed和override&#xff0c;无法继续重写。 接口 接口就是指定一组函数成员&#xff0c;而不实现…

疑难杂症-暂时不能解析域名“mirrors.tuna.tsinghua.edu.cn”

可能是太久没用Ubuntu了&#xff0c;总是有一些莫名其妙的问题 我的方法简单粗暴&#xff1a;不需要重启&#xff0c;打开终端&#xff0c;输入sudo apt-get update&#xff0c;解析成功 还有一些别的方法&#xff0c;不过我也没试过 修改/etc/resolv.conf还是修改/etc/resol…

商家为什么要做霸王餐,外卖霸王餐赚钱吗?

霸王餐是什么&#xff1f; 外卖霸王餐是外卖商家为了在外卖平台(美团外卖/饿了么/抖音外卖)增加销量&#xff0c;增加评分&#xff0c;优化评价的一种让利营销手段。 举个栗子&#x1f330;:外卖商家将正常销售的套餐(菜品)拿出一部分通过霸王餐平台让潜在消费者抢名额&#xf…

大厂面试题-什么是服务网格?

概述 服务网格这个概念出来很久了&#xff0c;从2017年被提出来&#xff0c;到2018年正式爆发&#xff0c;很多云厂商和互联网企业都在纷纷向服务网格靠拢。像蚂蚁集团、美团、百度、网易等一线互联网公司&#xff0c;都有服务网格的落地应用。 服务网格是微服务架构的更进一…

数组行和列的计算

数组行和列的计算 数组行大小的计算 sizeof(array)/sizeof(array[0]) # 数组的大小除以第一行的大小 数组列大小的计算 sizeof(array[0])/sizeof(array[0][0]) # 第一行的大小除以第一个元素的大小

【开题报告】基于SpringBoot的研究生管理系统的设计与开发

1.研究背景 研究生教育是高等教育体系中的重要组成部分&#xff0c;对于培养高层次、高水平的专业人才和推动科学研究具有重要意义。研究生管理是保证研究生培养质量和提升研究生培养工作效率的关键环节。然而&#xff0c;传统的研究生管理方式存在一些问题&#xff0c;如信息…

面试算法49:从根节点到叶节点的路径数字之和

题目 在一棵二叉树中所有节点都在0&#xff5e;9的范围之内&#xff0c;从根节点到叶节点的路径表示一个数字。求二叉树中所有路径表示的数字之和。例如&#xff0c;图8.4的二叉树有3条从根节点到叶节点的路径&#xff0c;它们分别表示数字395、391和302&#xff0c;这3个数字…

万物摩尔定律:人工智能技术的快速迭代将使人类万劫不复?

第一次工业革命&#xff1a;蒸汽机时代&#xff1b; 第二次工业革命&#xff1a;电气化时代&#xff1b; 第三次工业革命&#xff1a;信息化时代&#xff1b; 第四次工业革命&#xff1a;智能化革命。这一场革命正在上演&#xff0c;是人工智能&#xff08;AI&#xff09;带…

LeetCode----42. 接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝…

Linux常用操作及主流服务部署命令

目录 Linux 系统目录 一、常用操作命令 1、目录操作 2、文件内容操作&#xff08;查看日志&#xff0c;更改配置文件&#xff09; 3、压缩和解压缩 4、更改文件权限 二、各服务部署命令 1、增加虚拟内存 2、JDK 2.1 删除系统自带的openjdk 2.2 安装jdk 2.3 删除jd…

怎么开发小程序?微信小程序开发方式

小程序开发之所以受到欢迎&#xff0c;是因为相比于APP&#xff0c;小程序的开发成本更低。不需要下载和安装&#xff0c;用户可以直接在微信内使用&#xff0c;节省了开发和维护的成本。小程序的开发方式有很多种&#xff0c;常见的有&#xff1a;自己源码开发、模板编辑、购买…

开关电源老化试验和性能检测系统软件

开关电源自动测试系统由PC(工控机)、测试工装、可编程直流电源、数字示波器、可编程直流电子负载、继电器模块等部分组成&#xff0c;并通过RS232/LAN通讯总线、测试夹具以及其它线缆等进行连接&#xff0c;为系统组成结构。PC与可编程直流电源、数字示波器、可编程直流电子负载…

呼叫中心的重要考核指标

呼叫中心在运营过程中越来越精细化&#xff0c;在信息化管理的时代&#xff0c;呼叫中心系统是必不可少的&#xff0c;而呼叫中心的管理人员为了提升运营效率&#xff0c;通常会根据业务目标设置各种业务的考核指标&#xff0c;而我也根据OKCC在呼叫中心项目运营过程中的经验&a…

英语语法,时态总结,16种时态

文章目录 前言总体说明过去时一般过去时过去进行时过去完成时过去完成进行时 现在时一般现在时现在进行时现在完成时现在完成进行时 将来时一般将来时将来进行时将来完成时将来完成进行时 过去将来时一般过去将来时过去将来进行时过去将来完成时过去将来完成进行时 前言 学了这…

最全的操作系统原版镜像,镜像winxp、win7、8、10、11,win server2008、2012、2016、2019、2022各版本系统下载 址

1、 MSDN原版系统(我告诉你&#xff09; [软件、镜像下载地址](https://www.imsdn.cn/)2、 HelloWindows.cn 精校 完整 极致 Windows系统下载仓储站 镜像、软件下载地址 3、系统库 镜像下载地址 4、 山己几子木 镜像下载地址

springboot和flask整合nacos,使用openfeign实现服务调用,使用gateway实现网关的搭建(附带jwt续约的实现)

环境准备&#xff1a; 插件版本jdk21springboot 3.0.11 springcloud 2022.0.4 springcloudalibaba 2022.0.0.0 nacos2.2.3&#xff08;稳定版&#xff09;python3.8 nacos部署&#xff08;docker&#xff09; 先创建目录&#xff0c;分别创建config&#xff0c;logs&#xf…