Android Studio中GameActivity模板运行问题及解决方法咨询
解决GameActivity模板的两个运行问题
问题1:minSdk必须设置为30及以上的解决办法
GameActivity是Android 11(API Level 30)官方引入的原生游戏开发模板,核心API仅在API30及以上系统中存在,因此有两种处理方案:
- 方案一:升级minSdk版本
直接修改模块的build.gradle(或build.gradle.kts)配置,将minSdkVersion设置为30,同步项目后即可正常编译运行:android { defaultConfig { minSdkVersion 30 // 其他配置(targetSdkVersion、versionCode等)保持不变 } } - 方案二:兼容低版本系统
如果必须支持API29及以下,只能放弃GameActivity模板,改用传统的NativeActivity或自定义Java Activity结合JNI的方式实现,因为GameActivity的核心能力无法向下兼容。
问题2:Renderer类handleInput函数中motionEventsCount、motionEvents成员不存在的解决办法
模板代码混用了旧版NativeActivity的输入事件访问方式,GameActivity的输入事件需要通过专属API获取,修改后的代码如下:
#include <game-activity/native_app_glue/GameActivity.h> void Renderer::handleInput() { // 获取当前队列中的触摸事件数量 int motionEventsCount = GameActivity_getMotionEventCount(app_); for (auto i = 0; i < motionEventsCount; i++) { // 获取单个触摸事件,注意判空 const GameActivityMotionEvent* motionEvent = GameActivity_getMotionEvent(app_, i); if (!motionEvent) continue; auto action = motionEvent->action; // 解析指针索引 auto pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; aout << "Pointer " << pointerIndex << ":"; // 获取指针的坐标信息 const GameActivityPointerAxes* pointer = &motionEvent->pointers[pointerIndex]; auto x = GameActivityPointerAxes_getX(pointer); auto y = GameActivityPointerAxes_getY(pointer); aout << "(" << x << ", " << y << ") "; // 解析触摸动作类型(修正原代码的掩码错误) auto actionMasked = action & AMOTION_EVENT_ACTION_MASK; switch (actionMasked) { case AMOTION_EVENT_ACTION_DOWN: case AMOTION_EVENT_ACTION_POINTER_DOWN: aout << "Pointer Down"; break; case AMOTION_EVENT_ACTION_UP: case AMOTION_EVENT_ACTION_POINTER_UP: aout << "Pointer Up"; break; default: aout << "Pointer Move"; } aout << std::endl; } // 清除已处理的触摸事件 GameActivity_clearMotionEvents(app_); }
关键修改说明:
- 替换旧版NativeActivity的直接成员访问:用
GameActivity_getMotionEventCount(app_)替代app_->motionEventsCount,用GameActivity_getMotionEvent(app_, i)替代app_->motionEvents[i] - 修正动作掩码计算:原代码中
action & AINPUT_SOURCE_TOUCHSCREEN是错误的,AINPUT_SOURCE_TOUCHSCREEN是输入源类型,应使用AMOTION_EVENT_ACTION_MASK获取触摸动作类型 - 替换事件清理方法:用GameActivity专属的
GameActivity_clearMotionEvents(app_)替代NativeActivity的android_app_clear_motion_events(app_) - 确保引入正确的头文件
<game-activity/native_app_glue/GameActivity.h>
内容的提问来源于stack exchange,提问作者c-an
相关产品推荐
相关产品推荐

