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的拷贝走向图”中的其中两个,对应的是下图中的两个。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wireshark抓包查看langchain的ChatOpenAI接口发送和接收的数据

1. 引入 当我们用vllm部署一个大模型,就可以调用langchain的ChatOpenAI()接口来访问大模型(具体过程参考[1]),这也是langchain的Agent的基础接口使用方式。 那么问题来了,这个接口是使用哪种方式与大模型进行通信的呢…

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…

arcgis坐标系问题

2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据(影像图),如果打开80的数据则会投影错误,出现较大偏差。 解决方案:80数据框打开80数据,2000数据库打开2000数据。

0-1规划的求解

实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的:学会使用Matlab编程实现求解0-1规划。 实验内容:1.学习使用Matlab定义子函数的命令function; 2.编程求解0-1型整数规划的枚举法或隐枚举法。 例1:求…

RNN与Self-Attention

文章目录 1. SimpleRNN1.1 h t h_t ht​计算1.2 激活函数 2. SimpleRNNSelf-Attention2.1 状态更新2.2 权重 α α α 1. SimpleRNN 学习视频:https://www.youtube.com/watch?vCc4ENs6BHQw&t0s 对于时序数据,输入输出都不固定,需要ma…

R-CNN,Fast R-CNN,

R-CNN R-CNN可以说是利用深度学习进行目标检测的开山之作 RCNN算法流程可分为4个步骤 - 一张图像生成1K~2K个候选区域(使用Selective Search方法) - 对每个候选区域,使用深度网络提取特征 - 特征送入每一类的SVM 分类器,判别是否属于该类 - 使用回归器…

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…

人工智能证书合集

本文将对目前市面上主流官方机构颁发的人工智能证书进行整理和介绍,由于整理的证书较多,本文共一万八千多字,请根据自己的考证需求阅读对应部分的内容,希望本文对人工智能行业的从业人员和计划从事人工智能相关岗位工作的人员有所…

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考(spring-boot-helloWorld-2.x)示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf,实际以最新更新的手册为准。 2.本文…

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的,得自己一步步搭建。 这次讲如何发送图片消息,选择图片,显示图片消息。 还是有点难度的,好好看,好好学。 一、思路: 选择图片用:photoVie…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业,每天需要处理大量纸质文件,从合同到判决书,手动录入不仅费时,还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台,通过先进的光学字符识别(OCR)技术,将…

详解ReentrantLock--三种加锁方式

目录 介绍AQS: 直观方式解释加锁的流程: Node是什么:它里面有什么属性呢 图解队列的排队过程: 源码分析三种加锁流程: 我们先讲解一下非公平锁的加锁流程: Lock()方式加锁: 在源码里对于Lock()的解…

【教程】Git 标准工作流

目录 前言建仓,拉仓,关联仓库修改代码更新本地仓库,并解决冲突提交代码,合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具,配合代码托管仓库…

Postman断言与依赖接口测试详解!

在接口测试中,断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性,还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具,不仅支持发送HTTP请求和接收响应,还提供了丰富的断言功能,帮助测试…

百度SEO与SEM到底有什么区别?福建企业老板们需要了解的关键点【百度SEO专家】

大家好,我是林汉文,一名百度SEO专家。最近在与一些企业Boss沟通时,我发现很多人对SEO与SEM的区别并不清楚,有时甚至会混为一谈。SEO和SEM确实都是搜索引擎营销的重要手段,但它们在实现方式、效果和适用场景上都有着明显…

JavaFX WebView + Vue初始化加载数据解决方案

一般WebView加载Vue时,我们需要注入一些数据,而我发现当WebView加载完毕再注入脚本,Vue是无法正确识别注入的脚本函数,也无法正确获取所要注入的数据,因此可以采用以下方法解决Vue无法正确加载数据问题 1、配置WebView…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04, 本文安装的版本: cuda_11.1.0;cuDNN-8.2.1;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

传输层协议TCP详解(上篇)

目录 一. TCP协议 1.1 什么是TCP协议 1.2 TCP为什么叫传输控制协议 二. TCP协议段格式 三. 确认应答(ACK)机制 3.1 什么是确认应答机制 3.2 推导确认应答机制 四. 超时重传机制 五. 连接管理机制 5.1 六位标志位 5.2 如何…

wps宏代码学习

推荐学习视频:https://space.bilibili.com/363834767/channel/collectiondetail?sid1139008&spm_id_from333.788.0.0 打开宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮,会让细节别的更明显。膨胀也是形态学中的一种操作,在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作,可以构成开闭操作。 开操作是先腐蚀…