1

我遇到的问题似乎只发生在运行 Android OS 3.1 的联想 Thinkpad 平板电脑上。我正在使用 NDK 运行本机应用程序。该应用程序在模拟器和其他设备上运行良好。

每当我分配一个 int64_t(定义为 long long)时,我都会遇到带有信号 (4) 的 SIGILL 崩溃。例如,这些行将在设备上崩溃。

int64_t i = 0; 
long long j = 0;

我应该注意,应用程序运行良好,我可以看到菜单呈现正确、动画和等待输入。当我触摸时,我为时间戳分配 int64 变量,这就是崩溃发生的时候。无论我在这个应用程序中分配 int64 的位置,我都会崩溃。

奇怪的是,我加载了 NDK 附带的本机活动示例并尝试分配上述数据类型,它工作正常。两个应用程序具有相同的 Application.mk 和非常相似的 Android.mk 文件。我也尝试过清理项目。

我真的不确定接下来要看什么。

4

2 回答 2

2

我已经解决了这个问题。这个项目是一个 iOS 项目的一个端口,里面有一些 NEON 数学类。我们使用以下标志来支持 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 建议我尝试其他架构,这让我找到了我的解决方案。

于 2012-06-13T00:26:21.050 回答
1

听起来您的编译器正在生成 64 位指令,这些指令未由您机器上的处理器实现。你是交叉编译吗?如果是这样,请确保您在平板电脑中使用正确版本的 ARM(x86?)芯片。

于 2012-06-09T05:48:28.100 回答