Android 在特定设备上崩溃 - 由 int64 分配引起

标签 android c++ android-ndk

我遇到的问题似乎只发生在我运行 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/

相关文章:

android - 通过 Android Intent 将链接发送到 Whatsapp

java - ComponentCallbacks2 的 onTrimMemory() 没有被调用

c++ - 2 个重载具有相似的转换 - 内置运算符 integer[pointer-to-object]

Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 找不到文件

java - 当用户关闭应用程序时服务不会停止

android - 已启用 Multidex - 仍然无法合并 dex

通过 COM 端口的 C++ 通信

c++ - 私有(private)成员数据的模拟

java - ndk中的原生调用错误

android - NDK r10 b 32 位或 64 位或使用两者编译以及如何实现