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

news2024/11/5 18:26:00

流程图

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

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.coloradmin.cn/o/2230754.html

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

相关文章

Linux下Nginx的安装与使用

Linux下Nginx的安装与使用 博客: www.lstar.icu 开源地址 Gitee 地址: https://gitee.com/lxwise/iris-blog_parent Github 地址: https://github.com/lxwise/iris-blog_parent 序言 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子…

STM32 HAL库 SPI驱动1.3寸 OLED屏幕

目录 参考硬件引脚与接线 点亮屏幕CubeMX 配置OLED 驱动程序代码 参考 基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)0.96 oled HAL库驱动 SPI STM32SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制STM32驱…

江协科技STM32学习- P26 UART串口外设

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

基于Abaqus的高纯铝不同应变率下单晶塑性变形的取向依赖性研究

文章题目:《Strain rate effect of high purity aluminum single crystals: Experiments and simulations》 文章doi:10.1016/j.ijplas.2014.10.002 推荐理由:作者研究了高纯铝不同应变率下单晶塑性变形的取向依赖性,不同应变率…

虚拟现实与增强现实:重塑娱乐和教育的边界!

内容概要 在这个瞬息万变的时代,虚拟现实(VR)和增强现实(AR)正如两位魔法师,腾云驾雾间掀起了一场教育与娱乐的革命。虚拟现实带我们飞跃平凡,进入一个充满奇迹的数字宇宙,仿佛我们…

【论文分享】利用机器学习和计算机视觉技术增强城市街道峡谷中的PM2.5实时监测

本文以兰州市为研究区域使用计算机视觉技术从交通摄像头拍摄的交通图像中提取实时交通流量和街景特征,以预测PM2.5浓度,并解释道路环境变化对PM2.5水平的影响。 【论文题目】 Enhancing urban real-time PM2.5 monitoring in street canyons by machine…

《双指针篇》---复写零(标的简单,实际比较复杂)

题目传送门 方法一:双指针 我们发现不能从前向后复写,因为会覆盖掉还没有被复写的数据 因此我们需要从后往前复写。 此时left应该指向最后一个被复写的数。 right指向数组最后一个元素 1.找到最后一个被复写的数据。我们用left指向 ①先判断left的位置0/…

Docker(二):Docker的基本使用

1 Docker的基本使用 1.1 镜像相关操作 1、从DockerHub搜索镜像 [rootmaster ~]# docker search centos # 镜像名字 描述 星标 是否官方(有OK表示为官方镜像) NAME …

SQL Server 可观测最佳实践

SQL Server 简介 SQL Server 是微软公司开发的一款关系数据库管理系统,支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。它支持多种操作系统平台,而无论是物理还是虚拟形式,自建部署环境还是在云环境中,运行的操作系…

PyEcharts | 认识图形--饼图和玫瑰图

饼图和玫瑰图 饼图玫瑰图rosetype 参数 饼图 from pyecharts.charts import Pie import pyecharts.options as optsfrom pyecharts.globals import CurrentConfig,NotebookType CurrentConfig.NOTEBOOK_TYPE NotebookType.JUPYTER_LAB CurrentConfig.ONLINE_HOST OnlineHos…

ros与mqtt相互转换

vda5050 VDA5050协议介绍 和 详细翻译-CSDN博客 ros与mqtt相互转换 如何转换的,通过某个中转包,获取ros的消息然后以需要的格式转换为mqtt 需要的参数 ros相关 parameters[ (ros_subscriber_type, vda5050_msgs/NodeState), (ros_subscriber_queue…

这几款AI搜索产品,你用过几个?

AI搜索产品逐步走进普通大众的视野,当然也会有更多的产品进入市场供大家选择。 以下是一些常见的 AI 搜索产品: 综合型 AI 搜索平台: Perplexity:海外较受欢迎的 AI 搜索引擎,拥有百万用户。它利用 GPT、Claude、Llam…

[代码随想录打卡 Day3] 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

(ง •_•)ง今天出去玩了,只刷完了视频,做了部分题,就是具体整理明天整理。希望坚持下去。啊啊啊啊啊啊啊啊啊啊啊 链表理论基础 基础的就是单链表。 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成&#xff0…

OpenCV基本操作(python开发)——(8)实现芯片瑕疵检测

OpenCV基本操作(python开发)——(1) 读取图像、保存图像 OpenCV基本操作(python开发)——(2)图像色彩操作 OpenCV基本操作(python开发)——(3&…

LLM | 论文精读 | CVPR | SelTDA:将大型视觉语言模型应用于数据匮乏的视觉问答任务

论文标题:How to Specialize Large Vision-Language Models to Data-Scarce VQA Tasks? Self-Train on Unlabeled Images! 作者:Zaid Khan, Vijay Kumar BG, Samuel Schulter, Xiang Yu, Yun Fu, Manmohan Chandraker 期刊:CVPR 2023 DOI…

产品思维笔记(一):打造用户喜爱的产品by Marty Cagan

全文摘要 《启示录:打造用户喜爱的产品》是由美国著名产品经理Marty Cagan所著,他曾经是eBay最出色的产品经理之一,也是Google X实验室的创始人之一。在这本书中,他分享了自己的经验和教训,帮助读者更好地理解如何打造…

计算机网络八股文个人总结

1.TCP/IP模型和OSI模型的区别 在计算机网络中,TCP/IP 模型和 OSI 模型是两个重要的网络协议模型。它们帮助我们理解计算机通信的工作原理。以下是它们的主要区别,以通俗易懂的方式进行解释: 1. 模型层数 OSI 模型:有 7 层&#…

Unity humanoid 模型头发动画失效问题

在上一篇【Unity实战笔记】第二十二 提到humanoid 模型会使原先的头发动画失效,如下图所示: 头发摆动的是generic模型和动画,不动的是humanoid模型和动画 一开始我是尝试过在模型Optimize Game objects手动添加缺失的头发骨骼的,奈…

scala---10.30

val、var package com_1030class Person {var name:String"rose"def sum(n1:Int,n2:Int):Int{n1n2} } object Person{def main(args: Array[String]): Unit {//创建person对象var personnew Person()println(person.sum(10,20))//30println(person.name)person.nam…

Redis缓存在thinkPHP/fastAdmin框架中的应用

Redis缓存在thinkPHP/fastAdmin框架中的应用 引言 在现代Web开发中,性能优化是一个永恒的话题。随着用户数量的增加和业务逻辑的复杂化,如何提高应用的响应速度和处理能力成为了开发者们必须面对的挑战。缓存技术作为提升性能的有效手段之一&#xff0…