无法使用Android NDK中AMotionEvent_getActionButton函数的问题及解决
问题原因
你遇到的错误核心在于:NDK编译时默认以minSdkVersion对应的API级别作为编译基准。你的minSdkVersion设为14,远低于AMotionEvent_getActionButton要求的API 33。即便compileSdk和targetSdkVersion都设为33,NDK为保证低版本设备的兼容性,会限制代码只能调用minSdk及以下版本存在的API,因此该函数会被标记为不可用。
修复方案
方案1:指定NDK编译的最小API级别(仅适用于无需兼容低版本的场景)
在build.gradle的externalNativeBuild配置中,添加ANDROID_PLATFORM参数强制使用API 33编译:
defaultConfig { // 保留原有其他配置 externalNativeBuild { cmake { arguments '-DANDROID_STL=c++_static', '-DANDROID_PLATFORM=android-33' } } }
注意:此设置会让APP只能在API 33及以上设备运行,若需兼容低版本设备请使用方案2。
方案2:添加版本兼容判断(推荐,保留低版本兼容)
在C代码中先判断当前设备的API级别,仅在API 33及以上时调用目标函数,低版本使用替代逻辑:
#include <android/api-level.h> // ... 其他代码 int32_t buttonPress = 0; if (__ANDROID_API__ >= 33) { buttonPress = AMotionEvent_getActionButton(event); } else { // 低版本设备的替代逻辑:从AMotionEvent_getAction中解析按钮信息 int32_t action = AMotionEvent_getAction(event); buttonPress = action & AMOTION_EVENT_ACTION_BUTTON_MASK; }
若CMake未自动传递API级别宏,可在CMakeLists.txt中添加:
add_definitions(-D__ANDROID_API__=${ANDROID_MIN_SDK_VERSION})
另外,你的NDK版本25.1.8937393完全支持API 33,无需更换NDK。
内容的提问来源于stack exchange,提问作者user18514618
相关产品推荐
相关产品推荐

