我有一个关于使用 SQLite 与 Unreal Engine 5.0.3 c++ 来作为通用 Windows 平台 (UWP) 应用程序部署在 Microsoft HoloLens 2 上的问题。
我有一个自己编写的库作为模块集成在我的虚幻项目中,它依赖于 SQLite (https://www.sqlite.org/),除了一些业务逻辑之外,它还允许我读取和写入数据SQLite 数据库。在我自己编写的库中,我通过包含
该应用程序可以在我的本地计算机上构建和测试,没有任何问题。该应用程序可以针对 Microsoft Hololens 2 进行构建、部署和运行。
但是,当在 Microsoft Hololens 2 上运行应用程序和库并且应用程序只想在我的数据库中创建表时,我收到“磁盘 I/O 错误”,扩展错误代码为 5642:SQLITE_IOERR_SEEK。如果我查看文件目录(项目特定 Appdata 中的 LocalState 目录),我会看到创建的数据库具有 0kb 数据量。
如果有人能帮助我,我会非常高兴,因为几天来我一直被这个错误困扰。如果更多信息有用,请随时询问!
+CapabilityList=internetClientServer
+CapabilityList=privateNetworkClientServer
+CapabilityList=internetClient
+CapabilityList=AllJoyn
+CapabilityList=codeGeneration
+DeviceCapabilityList=microphone
+DeviceCapabilityList=webcam
+DeviceCapabilityList=gazeInput
+DeviceCapabilityList=wiFiControl
+DeviceCapabilityList=proximity
+DeviceCapabilityList=location
+DeviceCapabilityList=Bluetooth
+UapCapabilityList=musicLibrary
+UapCapabilityList=picturesLibrary
+UapCapabilityList=videosLibrary
+UapCapabilityList=blockedChatMessages
+UapCapabilityList=chat
+UapCapabilityList=enterpriseAuthentication
+UapCapabilityList=objects3D
+UapCapabilityList=phoneCall
+UapCapabilityList=removableStorage
+UapCapabilityList=sharedUserCertificates
+UapCapabilityList=userAccountInformation
+UapCapabilityList=voipCall
+Uap2CapabilityList=spatialPerception
+UapCapabilityList=appointments
+Uap3CapabilityList=backgroundMediaPlayback
+UapCapabilityList=contacts
+Uap6CapabilityList=graphicsCapture
+IotCapabilityList=lowLevelDevices
+Uap6CapabilityList=offlineMapsManagement
+Uap2CapabilityList=phoneCallHistoryPublic
+Uap3CapabilityList=remoteSystem
+IotCapabilityList=systemManagement
+Uap4CapabilityList=userDataTasks
+Uap3CapabilityList=userNotificationListener
+DeviceCapabilityList=lowLevel
+DeviceCapabilityList=pointOfService
+RescapCapabilityList=developmentModeNetwork
问题已解决!
该 bug 位于
Read
的 SQLiteEmbeddedPlatform.cpp
中的 UE SQLiteCore Plugin
函数中,通过在构建 Seek()
时调用 Microsoft HoloLens platform
函数来实现。深入研究 Seek()
的 FileHandle
实现的 Microsoft HoloLens Platform
函数,错误发生在 FileSeek()
函数中,该函数从位于 SetFilePointerEx()
的 Windows SDK 10.0.18362.0
调用函数 Windows Kits\10\Include\10.0.18362.0\um\fileapi.h
。由于某种未知的原因,该函数返回 false。 Seek()
对应的 Windows platform
函数不会检查返回值,始终返回 true。
这个问题可以通过使用名为
SQLiteZ
的自定义集成虚幻插件从源代码构建 SQLite 库来解决。 SQLite 库(sqlite3.h、sqlite3.c)的源代码来自 SQLite amalgamation。
要在 UE 插件中使用该库,在
SQLiteZ.Build.cs
文件中,必须正确设置适当的预处理器语句以构建 SQLite 库,供 Unreal UWP
在 Microsoft HoloLense 2
上使用。
有关详细信息,请参阅下面的代码块SQLiteZ.Build.cs
。
using UnrealBuildTool;
public class SQLiteZ : ModuleRules
{
public SQLiteZ(ReadOnlyTargetRules Target)
: base(Target)
{
PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
});
PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
});
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
// ... add other public dependencies that you statically link with here ...
});
PrivateDependencyModuleNames.AddRange(
new string[] {
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
// ... add private dependencies that you statically link with here ...
});
DynamicallyLoadedModuleNames.AddRange(
new string[] {
// ... add any modules that your module loads dynamically here ...
});
PrivateDefinitions.Add("SQLITE_API=__declspec(dllexport)");
PrivateDefinitions.Add("SQLITE_HAVE_ISNAN=1");
// Enable FTS
PrivateDefinitions.Add("SQLITE_ENABLE_FTS4");
PrivateDefinitions.Add("SQLITE_ENABLE_FTS5");
// Enable Deserialization and RTree Subsystem
PrivateDefinitions.Add("SQLITE_ENABLE_DESERIALIZE");
PrivateDefinitions.Add("SQLITE_ENABLE_RTREE");
// Enable Json extension
PrivateDefinitions.Add("SQLITE_ENABLE_JSON1");
if (Target.Platform == UnrealTargetPlatform.HoloLens) {
PrivateDefinitions.Add("SQLITE_OS_WINRT=1");
}
PrivateDefinitions.Add("SQLITE_OS_WIN=1");
PrivateDefinitions.Add("NDEBUG");
PrivateDefinitions.Add("SQLITE_THREADSAFE=1");
PrivateDefinitions.Add("SQLITE_TEMP_STORE=0");
PrivateDefinitions.Add("SQLITE_ENABLE_RTREE=1");
PrivateDefinitions.Add("SQLITE_ENABLE_GEOPOLY=1");
PrivateDefinitions.Add("SQLITE_ENABLE_JSON1=1");
PrivateDefinitions.Add("SQLITE_ENABLE_STMTVTAB=1");
PrivateDefinitions.Add("SQLITE_ENABLE_DBPAGE_VTAB=1");
PrivateDefinitions.Add("SQLITE_ENABLE_DBSTAT_VTAB=1");
PrivateDefinitions.Add("SQLITE_INTROSPECTION_PRAGMAS=1");
PrivateDefinitions.Add("SQLITE_ENABLE_COLUMN_METADATA=1");
PrivateDefinitions.Add("SQLITE_MAX_TRIGGER_DEPTH=100");
PrivateDefinitions.Add("SQLITE_THREAD_OVERRIDE_LOCK=-1");
bEnableUndefinedIdentifierWarnings = false; // The embedded SQLite implementation generates a lot of these warnings
bUseUnity = false; // Ensure the embedded SQLite implementation is always compiled in isolation
}
}
此处显示了将库集成为插件的目录结构。
更多信息请参考: