UE4安卓Gradle工程中的libUE4.so的生成原理

流程图

流程图放在最前面,下面是讲解。

libUE4.so

问:在UE4安卓开发中,libUE4.so即是符号表,又是引擎代码native,是吗?

答:是的,libUE4.so在UE4安卓开发中既包含符号表,也包含引擎的本地代码。这个库文件是UE4引擎的核心部分,包含了游戏运行所需的所有本地代码和符号信息。

符号表是程序的一部分,用于将程序中的符号(如变量名、函数名等)映射到它们在内存中的地址。在调试和开发过程中,符号表对于理解程序的工作原理和调试程序非常重要。

libUE4.so文件包含了引擎的本地代码,这些代码是游戏运行时执行的核心逻辑。这些代码是用C++编写的,并在编译时被编译成本地代码,以便在Android设备上运行。

因此,libUE4.so文件在UE4安卓开发中非常重要,它包含了游戏运行所需的所有本地代码和符号信息。

问:一个 libUE4.so 解压开来看到是怎么样的?对于UE4安卓构建来说,一个libUE4.so ,它即包含了代码,充当游戏的代码运行库,也包含了调试信息,可以充当符号表,是吗?

答:它解开来如上。是的,对于Unreal Engine 4(UE4)构建的安卓应用来说,`libUE4.so`是一个共享库(shared object),它确实包含了游戏或应用的代码以及可能包含的调试信息。

- **代码**: `libUE4.so`包含了UE4游戏项目的所有编译后的代码。这是游戏运行时所需的代码库,它实现了游戏逻辑、渲染、物理模拟、网络通信等功能。

- **调试信息**: 在开发过程中,如果构建配置设置为包括调试信息(例如,在UE4编辑器中选择"Development"或"Debug"配置),则`libUE4.so`文件还将包含调试符号。这些调试符号允许开发者在调试过程中查看变量值、设置断点、追踪执行流程等。

调试符号通常会增加文件的大小,因为它们包含了额外的元数据,这些元数据映射了机器码和源代码之间的关系。在最终发布版本中,为了减小应用程序包的大小,通常会移除这些调试符号。

在UE4中,你通常有以下几种构建配置选项:

- **Development**: 包括调试符号,但不进行优化,便于调试。

- **Debug**: 包括调试符号,并且可能会进一步降低性能以支持更深入的调试。

- **Shipping**: 不包括调试符号,进行全优化,适用于最终发布的版本。

如果需要在发布版本之后进行调试,开发者可能需要保留一个带有调试符号的特殊构建,以便于在必要时进行分析和调试。在Android平台上,可以通过使用NDK工具(如`ndk-stack`)来解析崩溃报告和`libUE4.so`中的符号信息,从而帮助诊断问题。

Gradle中的libUE4.so

经过BuildAndroid步骤后,而无须等到Package阶段(【MarkA】), Intermediate/Android/gradle 工程中存在 libUE4.so,它的位置是

D:\{项目}\Intermediate\Android\arm64\gradle\app\src\main\jniLibs\arm64-v8a\libUE4.so

D:\{项目}\Intermediate\Android\arm64\jni\arm64-v8a\libUE4.so

以及可以看到:

D:\{项目}\Intermediate\Android\gradle\app\src\main\jniLibs\arm64-v8a\libUE4.so

MarkA处的解释是:打包Android的步骤,即BuildMode.Build(),之中,打开了以下开关,但此文中,这个知识点不是很重要。

if (Makefile.bDeployAfterCompile)
{TargetReceipt Receipt = TargetReceipt.Read(Makefile.ReceiptFile);Log.TraceInformation("Deploying {0} {1} {2}...", Receipt.TargetName, Receipt.Platform, Receipt.Configuration);UEBuildPlatform.GetBuildPlatform(Receipt.Platform).Deploy(Receipt);
}

问:JNI的含义是什么?

答:在安卓开发中,JNI 是 Java Native Interface(Java本地接口)的缩写。

JNI 是一种编程框架,用于在 Java 程序和本地代码(如 C/C++)之间进行交互。它提供了一组标准的接口和机制,使得 Java 程序能够调用本地代码,并且本地代码也能够调用 Java 程序。

使用 JNI,开发者可以在 Java 程序中调用本地代码来执行一些高性能、底层或与特定平台相关的操作。这对于需要与底层系统交互、访问硬件功能或使用现有的本地库的应用程序非常有用。

在安卓开发中,JNI 经常用于以下情况:

1. 访问本地库:通过 JNI,可以将本地库(如 C/C++ 编写的库)与 Java 代码进行绑定,从而在 Java 程序中调用本地库的功能。

2. 调用系统 API:JNI 可以用于调用安卓系统提供的底层 API,以实现与系统功能的交互,如访问传感器、摄像头、文件系统等。

3. 性能优化:JNI 可以用于将一些性能敏感的代码从 Java 转移到本地代码中,以提高执行效率。

使用 JNI 需要编写一些本地代码,并在 Java 代码中进行相应的声明和调用。JNI 提供了一组函数和规范,用于管理 Java 对象和本地数据之间的转换、内存管理、异常处理等。

问:native是什么意思?

答:也就是安卓原生底层代码的意思。

问:NDK是什么意思?

答:NDK是Native Development Kit的缩写,中文通常翻译为“原生开发工具包”。它是由Google为Android平台提供的,允许开发者使用C或C++等本地编程语言编写应用程序的一部分。NDK提供了交叉编译器、工具和库,使得开发者能够编写和编译本地代码,然后将这些代码与Java或Kotlin编写的应用程序集成。

NDK的主要用途包括:

性能优化:对于需要高性能计算的应用,如游戏、图像处理或音频处理,使用NDK可以更直接地访问硬件资源,从而提高性能。

复用现有代码:如果开发者有大量的C或C++代码,他们可以使用NDK将这些代码集成到Android应用程序中,而不需要重写代码。

访问系统级API:NDK允许开发者访问一些Android系统级别的API,这些API可能不会被Java或Kotlin暴露。

开发游戏和图形密集型应用:游戏开发通常需要大量的本地代码来处理图形渲染和物理模拟等任务,NDK提供了必要的工具和库来支持这些操作。

使用NDK进行开发时,开发者需要使用CMake或ndk-build等工具来构建本地代码,并生成可以在Android设备上运行的本地库(如.so文件)。然后,这些本地库可以与Java或Kotlin代码通过JNI(Java Native Interface)或Java API进行交互。

生成原理

下面这张图表示了 libUE4.so 的来龙去脉,它们都是拷贝的关系,实际上是同一个文件。

(图:libUE4.so的拷贝走向图)

接下来是这张图的解释:

BuildAndroid

首先进行 BuildAndroid步骤。“BuildAndroid步骤”的命令如下:

%UBT% %ProjectName%Client Android %TargetBuildConfig% %ClientPath%\%ProjectName%.uproject -NoMutex %PGOProfile% %EXPORT_LINK_MAP% -log=%ClientPath%\%ProjectName%-Build-Android.log

对应日志:

2024-10-31 22:29:12:436 : WARNING: UnrealBuildTools.Commandline = {项目名}Client, Android, Shipping, D:\{项目名}.uproject, -NoMutex, -PGOOptimize

在编译代码的日志中找到 “项目名Client-Android-Shipping-arm64.so”的踪迹,说明它产生于 Execute Actions 中(什么是Execute Actions,可以参考我的文章 UBT如何编译UE4工程代码_ue ubt link-CSDN博客)。它的完整路径是: {项目}\Binaries\Android\{项目名}Client-Android-Shipping-arm64.so

2024-10-31 22:39:10:788 :   16 warnings generated.
2024-10-31 22:39:26:754 :   [37/38] 项目名Client-Android-Shipping-arm64.so
【这里打出来了】2024-10-31 22:39:26:847 :   [38/38] 项目名Client-Android-Shipping.target

“项目名Client-Android-Shipping-arm64.so”就是后来的 libUE4.so,它是Build安卓目标的产物。我在这里花费了很多时间,因为存在增量编译的缘故,它一直存在在本地,导致我在日志中查不到它的来源。因此,在 BuildAndroid 前,先将它删除掉,这样就能得到上面的日志文件了。

四次拷贝

“libUE4.so的拷贝走向图”中的其中两个,对应的是下图中的两个。

具体的拷贝过程在图中可以看出,因此不再详述,下面是整个流程图的完整版:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java线程池的核心内容详解

文章内容已经收录在《面试进阶之路》,从原理出发,直击面试难点,实现更高维度的降维打击! 目录 文章目录 目录Java线程池的核心内容详解线程池的优势什么场景下要用到线程池呢?线程池中重要的参数【掌握】新加入一个任…

Pandas DataFrame学习

1.DataFrame定义 DataFrame 是 Pandas 中的另一个核心数据结构,用于表示二维表格型数据。DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索…

如何在创建完fb公共主页后添加管理员防止封号?

在创建Facebook公共主页后,及时添加备用管理员是非常重要的。这可以帮助防止由于个人账号被封或其他限制因素导致无法继续管理公共主页的情况。以下是关于如何添加管理员及接受邀请的详细步骤。 Facebook公共主页的角色介绍 在Facebook公共主页上,有五种…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM,而后将该 PGM 地图充分运用到无人系统路径规划之中,使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。(解决如何使用PGM的问题) Hybrid A*算法 参考博客…

YOLOv10改进策略【注意力机制篇】| WACV-2024 D-LKA 可变形的大核注意 针对大尺度、不规则的目标图像

一、本文介绍 本文记录的是利用D-LKA模块优化YOLOv10的目标检测网络模型。D-LKA 结合了大卷积核的广阔感受野和可变形卷积的灵活性,有效地处理复杂的图像信息。本文将其应用到v11中,并进行二次创新,使网络能够综合多种维度信息,更…

人工智能中的机器学习和模型评价

文章目录 1.监督学习1.1线性回归1.2KNN算法1.3支持向量机 2.无监督学习2.1K-means聚类2.2FCA主成分分析 机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习并做出决策,而无需进行明确的编程。它涉及到开发算法和技术,使计算机能够…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA,现在准备写窗帘控制组件,构想的东西会比较多,估计有些难度,过程会比较长,边写边记录吧! #设备和场景环境# 使用的是Novo的电机&#xf…

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境,那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署,可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发,可以考虑使…

JVM 运行时数据区

JVM整体架构 可以分为三层: 1 JVM外部,从源文件到Class文件,再装载到JVM 2 JVM运行时数据区,相当于就是避风港、运行的大后方。给执行程序提供后勤。 3 执行引擎层。和运行时数据区交互,完成执行任务。 运行时数据…

新加坡托管服务器VS香港托管服务器:AI时代的选择策略

在人工智能迅速发展的今天,服务器作为数据存储与计算的核心基础设施,其性能、稳定性和地理位置对于用户体验和业务效率至关重要。对于中国用户而言,在选择服务器时,新加坡服务器和香港服务器无疑是两个极具吸引力的选项。两者同属…

DAYWEB69 攻防-Java 安全JWT 攻防Swagger 自动化算法签名密匙Druid 泄漏

知识点 1、Java安全-Druid监控-未授权访问&信息泄漏 2、Java安全-Swagger接口-文档导入&联动批量测试 2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取 Java安全-Druid监控-未授权访问&信息泄漏 Druid是阿里巴巴数据库事业部出品,为监控而…

vscode使用技巧

vscode如果要用来写不同的语言,可以通过创建的工作区,然后创建不同的快捷方式以便打开它 注:C/C 退回到1.8.4,为了生成可以配置的文件 1.创建工作区 将工作区另存为 -> 选择你要写的文件夹的根目录 -> Save 2.归纳可执行…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…

记录一次企业外部通过ssh 连接数据库的事DBeaver

情况大概是这样,公司算法供应商开通了连接某个服务器A的权限,但是数据库x是在另一台服务器B上。 直接通过外部连接数据库是不行的,需要借用服务器A来进行访问x 使用软件:DBeaver, 数据库x类型:oracle 需要的信息&am…

Java爬虫的京东“寻宝记”:揭秘商品类目信息

开篇:Java特工的神秘任务 在这个数据驱动的时代,我们就像一群特工,穿梭在数字的海洋中,寻找着隐藏的宝藏——商品类目信息。今天,我们将带领你一起,用Java这把精密的瑞士军刀,深入京东的神秘领…

Linux——— 信号

文章目录 前言:引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理(浅谈):如何自定义捕捉 信号保存(浅谈) 信号产生系统调用产生异常产生:浅谈除0异常浅谈解引用野指针异常Core &&…

Java面试经典 150 题.P169. 多数元素(005)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int majorityElement(int[] nums) …

antdesignvue + AWS-S3实现Minio大文件分片上传

一、后端&#xff1a; 1.引入pom <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.12.263</version></dependency> 2.配置application.yml jeecg:minio:minioUrl: http…

维修日常-卷帘门电子遥控钥匙接触不良的维修日志

前段时间&#xff0c;单位领导扔来一个卷帘门遥控钥匙给我&#xff0c;说是接触不良&#xff0c;让我看看什么情况&#xff1f;如下图所示&#xff1a; 测试后发现按住这个钥匙按键时&#xff0c;红灯不能一直亮&#xff0c;所以只能打开看看&#xff0c;如下图&#xff1a; 可…