You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android C++ NativeActivity编译通过但启动崩溃求助

Native C++项目整合NativeActivity启动崩溃排查

环境与问题描述

  • 开发环境:Windows 10 x64 + Android Studio
  • 项目背景:基于Native C模板创建,整合Google NativeActivity示例代码实现C OpenGL屏幕变色功能,编译成功
  • 故障现象:在Cubot C30(Android 10)、TechnoPova5(Android 14)设备启动时,窗口闪过后崩溃,未修改Native C++模板的其他文件

核心排查方向

1. 生命周期入口冲突

Native C++模板默认依赖native_app_glue框架,使用android_main作为入口,通过app_dummy()绑定生命周期回调;而Google NativeActivity示例可能直接使用原始的ANativeActivity_onCreate入口逻辑。两种入口共存会导致系统无法正确初始化Native环境,引发崩溃。

  • 检查代码中是否同时存在android_mainANativeActivity_onCreate,需统一为一种入口逻辑:要么保留native_app_glueandroid_main,适配示例代码到该框架;要么移除native_app_glue依赖,完全使用NativeActivity原生回调。

2. OpenGL上下文初始化适配问题

Android 10和14的OpenGL ES版本支持、上下文创建流程存在差异,容易引发初始化失败:

  • 确认代码中EGL_CONTEXT_CLIENT_VERSION是否设置为设备支持的版本(比如2或3),Android 14对高版本OpenGL ES的兼容性校验更严格。
  • 添加EGL初始化步骤的日志(用__android_log_print输出),检查eglInitializeeglChooseConfigeglCreateContext等调用的返回值,若未处理无效配置直接创建上下文,会触发崩溃。

3. 清单配置错误

NativeActivity的清单配置与模板默认的Activity配置差异较大,若未修改会导致组件初始化失败:

  • 确保<activity>标签的android:nameandroid.app.NativeActivity,而非模板默认的AppCompatActivity
  • 检查<meta-data>android.app.lib_name的值是否与build.gradle中配置的库名一致,否则系统无法找到Native库。
  • 确认添加了必要的configChanges属性,避免因配置变更触发重建崩溃:
    <activity android:name="android.app.NativeActivity"
              android:label="@string/app_name"
              android:configChanges="orientation|keyboardHidden|screenSize">
        <meta-data android:name="android.app.lib_name"
                   android:value="你的Native库名称" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

4. ABI兼容性与库依赖

  • 检查build.gradlendk.abiFilters是否包含目标设备的ABI:Cubot C30通常为armeabi-v7a,TechnoPova5为arm64-v8a,若只编译了x86架构库,设备会因无法加载库崩溃。
  • 确认CMakeLists.txt中链接了必要的系统库:-lGLESv2-landroid-llog-lEGL,缺少这些库会导致符号查找失败,触发崩溃。

5. 崩溃栈定位建议

  • 查看LogCat的崩溃日志,若出现java.lang.UnsatisfiedLinkError,对应库名或ABI不匹配问题;若出现SIGSEGV信号,对应空指针或无效内存访问,需检查OpenGL相关指针(如ANativeWindowEGLDisplay)是否为空。
  • 使用Android Studio的Native Debugger附加到进程,捕获崩溃时的调用栈,定位具体出错的代码行。

快速验证步骤

  1. 先在Android 10和14的模拟器上运行项目,排除设备硬件兼容性问题。
  2. 简化代码:暂时移除OpenGL变色逻辑,只保留NativeActivity的基础初始化,确认是否能正常启动,逐步添加代码定位崩溃点。

内容的提问来源于stack exchange,提问作者ALBa

火山引擎 最新活动