我正在尝试将游戏移植到 Android,并且我一直在使用 boost 来进行保存/加载行为。现在调用保存代码时应用程序崩溃。尝试制作 text_oarchives 时发生崩溃,如以下示例代码所示:
void OHRMapArchiver::saveMap()
{
// copy some boost-incompatible data structures into ivar vectors
mapInstance->preSave();
CCLog("preSave");
std::ofstream outStream(MAP_SAVE_FILE);
CCLog("creating archive");
boost::archive::text_oarchive outputArchive(outStream);
CCLog("Outputting archive");
outputArchive << mapInstance;
// destroy all that stuff copied during pre-save
mapInstance->tileLoader.erase(mapInstance->tileLoader.begin(), mapInstance->tileLoader.end());
}
我当然可以使用一些建议来说明为什么情况并非如此。我已经放弃了能够在设备上进行调试,但是我得到的具体错误是什么时候
boost::archive::text_oarchive outputArchive(outStream);
被称为“致命信号 11 (SIGSEGV) at 0xdead (code=1), thread 1969 (Thread-112)”。所以段错误,但我无法想象为什么,据我所知,它只是在 ostream 周围创建一个包装器。
其他有用的线索...嗯,我知道我可以创建实现序列化的对象(Archive &ar, int version),尽管我不能确定任何对象已经成功调用它。可能的联动问题?
此外,还为 App 启用了文件访问权限。至少,“uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 已添加到清单中,我可以使用 std::ostream.write 制作和输出文件而不会崩溃。此外,正如标题所暗示的,win32 版本完美运行,按预期输出数据并在没有崩溃的情况下回读。
在使用 Jelly Bean 的设备上使用 crystaX ndk r7。
关于为什么这会在 Android 上崩溃的任何想法?
编辑:对此进行更新。根据 Boost 爱好者的说法,我认为 Boost 与最新的 Android NDK 官方版本不兼容的假设是错误的。如果正确定义了用户配置文件,boost 应该可以针对最新版本进行编译。
相反,我听到的隆隆声提高 iostreams 经常与 Kit 崩溃。