使用Android C++ NNAPIs调用ANeuralNetworksCompilation_createForDevices报错如何解决
Android NNAPI GPU访问问题排查与解决指南
链接失败问题排查
- 校验API版本匹配:
ANeuralNetworksCompilation_createForDevices是*Android 10(API Level 29)*才新增的接口,需确保工程minSdkVersion≥29,否则会找不到符号导致链接失败。 - 检查NNAPI库链接配置:
- 若使用CMake构建,需在
CMakeLists.txt中添加如下配置链接NNAPI动态库:
find_library(NN_LIB neuralnetworks REQUIRED) target_link_libraries(你的目标模块名 ${NN_LIB})- 若使用ndk-build构建,需在
Android.mk中添加配置:
LOCAL_LDLIBS += -lneuralnetworks - 若使用CMake构建,需在
- 检查符号裁剪配置:若工程开启了符号隐藏或者编译裁剪,可通过
nm -D 你的编译输出.so命令检查NNAPI相关导入符号是否存在,若不存在需调整混淆/裁剪规则保留NNAPI相关符号。
接口调用报错排查
首先需捕获接口的返回值,根据返回值定位问题类型,常见问题及解决方案如下:
- 返回
ANEURALNETWORKS_ERROR_BAD_DATA(参数非法):- 检查传入的设备列表是否合法:需先通过
ANeuralNetworks_getDeviceCount获取设备总数,再通过ANeuralNetworks_getDevice拿到类型为ANEURALNETWORKS_DEVICE_TYPE_GPU的设备实例,禁止传入空设备指针、越界的设备索引或者未初始化的设备列表。 - 检查传入的模型是否已完成构造:调用该接口前必须先执行
ANeuralNetworksModel_finish完成模型构建,未完成构造的模型会触发参数非法错误。
- 检查传入的设备列表是否合法:需先通过
- 返回
ANEURALNETWORKS_ERROR_UNSUPPORTED_OPERATION(操作不支持):- 先调用
ANeuralNetworksModel_getSupportedOperationsForDevices查询当前GPU设备支持的算子列表,替换模型中不支持的算子,或者添加CPU fallback逻辑,当GPU不支持时自动回落到CPU执行。
- 先调用
- 返回
ANEURALNETWORKS_ERROR_INSUFFICIENT_RESOURCES(资源不足):- 关闭其他占用GPU资源的进程,减少模型的batch size或者输入尺寸后重试。
- 返回
ANEURALNETWORKS_ERROR_PERMISSION_DENIED(权限不足):- 部分厂商定制ROM会限制第三方应用直接调用GPU NNAPI能力,可执行
adb shell dumpsys neuralnetworks查看系统开放的加速设备列表,确认GPU设备对第三方应用开放。
- 部分厂商定制ROM会限制第三方应用直接调用GPU NNAPI能力,可执行
快速验证方法
可先移除设备指定逻辑,调用默认的ANeuralNetworksCompilation_create接口验证模型本身可正常编译运行,再逐步添加GPU指定逻辑,缩小问题排查范围。
内容的提问来源于stack exchange,提问作者Mohammed Siddiqh
相关产品推荐
相关产品推荐

