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

应用执行异常:无法定位ANativeWindow_fromSurfaceTexture符号求助

解决ANativeWindow_fromSurfaceTexture符号找不到的问题

这个问题我做NDK开发时也踩过一模一样的坑,核心就是API级别兼容的问题,咱们一步步拆解来看:

问题根源

你在头文件里看到的#if __ANDROID_API__ >= 13是关键线索:ANativeWindow_fromSurfaceTexture这个函数是从Android 3.2(对应API级别13)才正式加入NDK原生API的。如果你的项目满足以下任一情况,编译出来的aaa.so里就不会包含这个函数的符号:

  • NDK编译时指定的目标平台(APP_PLATFORM/ANDROID_PLATFORM)低于13
  • 应用的最低兼容API级别(minSdkVersion)低于13,且编译时没有强制启用高版本API的符号

而ANativeWindow_fromSurface是从API 9就存在的老接口,所以不会有这个问题。

具体解决办法

1. 调整NDK编译的API级别

根据你的构建工具类型修改配置:

  • ndk-build项目:在Application.mk里添加或修改:
    APP_PLATFORM := android-13
    
  • CMake项目:在CMakeLists.txt里设置:
    set(ANDROID_PLATFORM android-13)
    
  • Gradle配置:确保Module级build.gradle里的minSdkVersion至少为13:
    android {
        defaultConfig {
            minSdkVersion 13
            // 其他配置...
        }
    }
    

2. 兼容低版本设备(如果需要)

如果你的应用必须支持API<13的老设备,就得做动态兼容处理:

  • 在原生代码里先判断当前设备的API级别:
    #include <android/api-level.h>
    
    if (android_get_device_api_level() >= 13) {
        // 安全调用ANativeWindow_fromSurfaceTexture
        ANativeWindow* window = ANativeWindow_fromSurfaceTexture(env, surfaceTexture);
        // 后续操作...
    } else {
        // 降级处理,比如改用ANativeWindow_fromSurface
        ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
    }
    

3. 验证符号是否存在

可以用NDK自带的nm工具检查aaa.so里有没有目标符号,命令如下(替换为你的NDK路径和架构):

$NDK_PATH/toolchains/llvm/prebuilt/[你的系统]/bin/aarch64-linux-android-nm -D aaa.so | grep ANativeWindow_fromSurfaceTexture

如果有输出,说明符号已经正确打包;如果为空,就得再检查你的编译配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:38:15