2

我正在尝试将游戏移植到 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 崩溃。

4

1 回答 1

0

这真的不是答案。我没有找到/找不到其中之一。我只能建议您不要尝试做我正在做的事情。至少,不是 android NDK r8d。

在研究了正确配置 Boost 以在没有 wchar 支持的情况下构建的方法之后,NDK 有点半信半疑,在 windows 上工作的代码在 boost 中的序列化/存档库中的某处崩溃。我不知道在哪里。

所以是的,答案是“放弃,最好在浪费四个月的跟踪解决方案之前放弃”。

于 2013-04-11T18:03:15.123 回答