You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:45:46