我遇到的问题似乎只发生在我运行 Android OS 3.1 的 Lenovo Thinkpad 平板电脑上。我正在使用 NDK 运行 native 应用程序。该应用程序在模拟器和其他设备上运行良好。
每当我分配一个 int64_t(定义为 long long)时,我都会收到带有信号 (4) 的 SIGILL 崩溃。例如,这些行将在设备上崩溃。
int64_t i = 0;
long long j = 0;
我应该注意到,应用程序运行良好,我可以看到菜单正确呈现、动画并等待输入。当我触摸时,我为时间戳分配了 int64 变量,这是崩溃发生的时间。无论我在此应用程序中的何处分配 int64,都会发生崩溃。
奇怪的是,我加载了NDK自带的native-activity示例并尝试分配上述数据类型并且它工作正常。这两个应用程序具有相同的 Application.mk 和非常相似的 Android.mk 文件。我也尝试过清理项目。
我真的不确定接下来要看什么。
最佳答案
我已经解决了这个问题。这个项目是一个 iOS 项目的端口,其中有一些 NEON 数学类(class)。我们使用以下标志来支持 NEON:
-mfpu=neon -mfloat-abi=softfp
我们最初在 Android 项目中使用了相同的标志,这些标志最初有效。尽管我们一拿到新的测试设备(联想 Thinkpad 平板电脑),我们就开始遇到上述崩溃。由于为 armeabi-v5 构建工作并且不使用 NEON,我知道它是相关的。事实证明,有比使用上述标志更好的方法为 NEON for Android 进行编译。我删除了上面的标志,以便我们的 Android.mk 看起来像这样:
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DHAS_NEON=1
MY_SRC_FILES += myfile.cpp.neon
else
LOCAL_CFLAGS += -DHAS_NEON=0
MY_SRC_FILES += myfile.cpp
endif
这意味着只有真正需要为 NEON 构建的文件才是。联想 Thinkpad 平板电脑 (Nvidia Tegra 2) 内的处理器不支持 NEON,因此显然构建所有支持 NEON 的文件是以处理器不喜欢的方式生成指令。
感谢 Keith 建议我尝试其他架构,这让我找到了我的解决方案。
关于Android 在特定设备上崩溃 - 由 int64 分配引起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10958719/