Unity Android IL2CPP 编译报错的一种可能原因_error: il2cpp error (no further information about -程序员宅基地

技术标签: Unity  3.3 Unity  

Unity 版本 5.6.6f2

在使用 Android 的 IL2CPP 时,发生编译报错,报错内容如下所示:

stdout:
IL2CPP error (no further information about what managed code was being converted is available)
Additional information: Build a development build for more information. δ�������������õ�������ʵ����
il2cpp.exe didn't catch exception: System.NullReferenceException: δ�������������õ�������ʵ����
   �� Unity.IL2CPP.Extensions.GetBaseType(TypeReference typeReference)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.AddStaticUsageRecursiveIfNeeded(TypeReference genericType)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Process(Instruction instruction, MethodDefinition method)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.ProcessType(TypeDefinition type)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Collect(AssemblyDefinition assembly)
   �� Unity.IL2CPP.AssemblyConverter.PreProcessStage(IInteropDataCollector interopDataCollector, ReadOnlyInflatedCollectionCollector& readOnlyGenericsCollectionCollector, TypeDefinition[]& allTypeDefinitions)
   �� Unity.IL2CPP.AssemblyConverter.Apply()
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� il2cpp.Program.DoRun(String[] args)
   �� il2cpp.Program.Run(String[] args)
   �� il2cpp.Program.Main(String[] args)
stderr:

δ���������쳣:  System.NullReferenceException: δ�������������õ�������ʵ����
   �� Unity.IL2CPP.Extensions.GetBaseType(TypeReference typeReference)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.AddStaticUsageRecursiveIfNeeded(TypeReference genericType)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Process(Instruction instruction, MethodDefinition method)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.ProcessType(TypeDefinition type)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Collect(AssemblyDefinition assembly)
   �� Unity.IL2CPP.AssemblyConverter.PreProcessStage(IInteropDataCollector interopDataCollector, ReadOnlyInflatedCollectionCollector& readOnlyGenericsCollectionCollector, TypeDefinition[]& allTypeDefinitions)
   �� Unity.IL2CPP.AssemblyConverter.Apply()
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� il2cpp.Program.DoRun(String[] args)
   �� il2cpp.Program.Run(String[] args)
   �� il2cpp.Program.Main(String[] args)

UnityEngine.Debug:LogError(Object)
UnityEditorInternal.Runner:RunManagedProgram(String, String, String, CompilerOutputParserBase, Action`1) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildUtils.cs:96)
UnityEditorInternal.IL2CPPBuilder:RunIl2CppWithArguments(List`1, Action`1, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:313)
UnityEditorInternal.IL2CPPBuilder:ConvertPlayerDlltoCpp(ICollection`1, String, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:304)
UnityEditorInternal.IL2CPPBuilder:Run() (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:151)
UnityEditorInternal.IL2CPPUtils:RunIl2Cpp(String, String, IIl2CppPlatformProvider, Action`1, RuntimeClassRegistry, Boolean) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:34)
UnityEditor.HostView:OnGUI()

从报错信息来看,是空引用异常,但是却没有指明错误的具体位置。另外,通过其他工程测试 IL2CPP 编译是正常的,说明是当前工程的代码有问题。通过排除法来定位具体错误的位置,最终定位到代码里有一个方法,如下:

static bool IsIosDeviceHighEnd()
{
    string generation = UnityEngine.iOS.Device.generation.ToString().ToLower();
    return list.Contains(generation);
}


虽然在 Android 下不会调用这个方法,但还是进行编译了,而 UnityEngine.iOS.Device 是 iOS 系统的特殊功能接口,在 Android 的 IL2CPP 并没有对应的 C++ 实现,所以就编译错误了。

这里可以通过加宏来控制编译,如下

#if UNITY_IOS
static bool IsIosDeviceHighEnd()
{
    string generation = UnityEngine.iOS.Device.generation.ToString().ToLower();
    return list.Contains(generation);
}
#endif

之后如果再遇到 IL2CPP 编译错误,可以检查下是否包含了 Android 平台下没有实现的方法接口之类的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/akof1314/article/details/84664078

智能推荐

el-input 键盘按下弹起事件无效 加.native_el-input上使用键盘事件.native被废弃了-程序员宅基地

文章浏览阅读1.1k次。<el-input size="small" @keyup.enter.native="handleInputConfirm"></el-input>_el-input上使用键盘事件.native被废弃了

sql语句_"7.sql 语句\"show database like “%name’\",能显示出 数据库。"-程序员宅基地

文章浏览阅读94次。Structured Query Language:结构化查询语言数据库的注释:单行注释:-- 注释内容 #注释内容(mysql特有)多行注释:/* 注释内容 */1、DDL(Data Definition Language)数据定义语言数据库,表,列等。关键字:create, drop,alter 等create database-- 查询所有数据库show database;-- 查询某个数据库的创建语句show create database databa_"7.sql 语句\"show database like “%name’\",能显示出 数据库。"

Integer和Int_integer -1-程序员宅基地

文章浏览阅读166次。参考博客1参考博客21、Integer和int的区别Integer是int的包装类,int是八大基本数据类型之一Integer是类,默认值为null,int默认值为0Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值2 、Integer的自动拆箱和装箱自动拆箱和装箱是jdk1.5之后的功能装箱就是由基本数据类型封装成类的过程,拆箱反之。装箱:正常创建类的对象是new一个出来,但是Integer类可以直接Integer a=11;通过反编_integer -1

input上传图片并且实现预览_input上传图片并预览-程序员宅基地

文章浏览阅读6.4k次,点赞5次,收藏20次。文章目录前言一、确定思路二、书写代码1.HTML部分2.CSS部分3.JS部分(重点)3.1.点击选择图片按钮,调用input文件框事件的的代码3.2.转换格式3.3.发送图片给后端前言在网站中,上传图片这个功能,这个还是挺常见的。比如说:在填写信息中,上传头像中。提示:以下是本篇文章正文内容,下面案例可供参考一、确定思路整个功能,大致可以分为三个步骤。点击选择图片的按钮,从本地选择一张图片。(选图片)选择好之后,会进行预览。就好比自己微信要换头像,选择好之后,都会有预览的步骤。(预_input上传图片并预览

成都信息工程大学计算机考研调剂,网络空间安全学院2020年硕士研究生招生复试调剂公告...-程序员宅基地

文章浏览阅读530次。网络空间安全学院2020年硕士研究生招生复试调剂公告一、学院简况网络空间安全学院前身为2004年成立的网络工程系,2008年更名为网络工程学院,2013年更名为信息安全工程学院,2017年改为现名。学院建有新一代密码技术与系统安全四川省重点实验室(筹)、网络空间安全四川省高校重点实验室、成都市信息安全保密重点实验室和成都商用密码技术研究院;设有信息安全、信息对抗技术、网络工程、物联网工程四个本科专..._成都有计算机专业调剂的研究生

Ubuntu14.04安装MySQL可视化管理工具MySQL-Workbench_ubantu mysql 可视化-程序员宅基地

文章浏览阅读470次。1、建议先更新列表sudo apt-get update2、安装MySQL-Workbenchsudo apt-get install mysql-workbench中间提示“您希望继续执行吗”,输入y,按回车继续3、安装成功,输入以下代码查看,可以看到已安装的相关服务及版本。dpkg -l|grep mysql-workbench5、在搜索栏找到已安装的mysql-wor..._ubantu mysql 可视化

随便推点

7-3 计算分段函数[1] (10 分)-程序员宅基地

文章浏览阅读375次。本题目要求计算下列分段函数f(x)的值:输入格式:输入在一行中给出实数x。输出格式:在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。输入样例1:10输出样例1:f(10.0) = 0.1输入样例2:0输出样例2:f(0.0) = 0.0代码:import java.util.Scanner;public class Main { public static void main(S._7-3 计算分段函数[1]

python爬虫——lxml的使用_importrequestsfromlxmlimportetree headers={"user-a-程序员宅基地

文章浏览阅读928次,点赞3次,收藏7次。为了更好的学习scrapy库,我决定先其前驱内容lxml库此次我们爬取豆瓣电影Top250代码如下:import requests from lxml import etreeimport timeimport csvheaders={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53..._importrequestsfromlxmlimportetree headers={"user-agent":"mozilla/5.0 (wi

nodejs中的promise基本操作_nodejs new promise-程序员宅基地

文章浏览阅读1.6k次。1.为什么要使用promise/*需求:异步的按顺序去读取1.txt、2.txt、3.txt文件的内容假设 1.txt内容为111 、2.txt内容为222、3.txt内容为333*/var fs = require('fs');、 fs.readFile('./files/1.txt','utf8',function(err,data){ if(err){ ..._nodejs new promise

基于SSM框架的水果商城设计与实现_基于ssm框架的妙橙水果屋的设计与实现-程序员宅基地

文章浏览阅读740次。开发工具(eclipse/idea/vscode等):数据库(sqlite/mysql/sqlserver等):功能模块(请用文字描述,至少200字):_基于ssm框架的妙橙水果屋的设计与实现

boost::function的用法(一)_boost::function0 function1-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏2次。boost::function的用法本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象。1. 介绍 Boost.Function 库包含了一个类族的函数对象的包装。它的概念很像广义上的回调函数。其有着和函数指针相同的特性但是又包含了一个调用的接口。一个_boost::function0 function1

K8S:使用Filebeat收集K8S内Pod应用日志_filebeat收集pod日志-程序员宅基地

文章浏览阅读7k次。K8S:使用Filebeat收集K8S内Pod应用日志一、环境描述没有K8S集群时应用日志通过filebeat–>redis–>logstash–>es–>kibana进行收集展示,上K8S集群后也需要考虑收集日志的问题,此处仅考虑 pod 中java应用生产的 info 和error文本日志。Kubernetes集群中的日志收集解决方案我们采用sidecar方案,将filebeat与应用部署到同一个pod,将应用日志挂载到主机目录,filebeat将日志挂载到其容器内。_filebeat收集pod日志

推荐文章

热门文章

相关标签