在Android Studio中使用Chaquopy把Python脚本跑起来时,OpenCV往往是图像处理类应用的核心依赖。但不少人在执行import cv2时会直接抛出ModuleNotFoundError,或者运行时报UnsatisfiedLinkError。这类问题大多不是代码写错,而是版本兼容和打包配置没对上。

一、确认Chaquopy与Python版本范围
Chaquopy每个版本都绑定了特定的Python小版本,例如某版只支持python3.8或3.9。如果你在gradle里写了过高的Python版本,pip安装OpenCV时就会找不到对应wheel。
查看方式是在项目根目录的build.gradle中,注意如下片段:
plugins {
id 'com.chaquo.python' version '12.0.1'
}
android {
compileSdkVersion 33
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
对应的python配置一般在app模块的build.gradle:
python {
version "3.8"
pip {
install "opencv-python-headless==4.5.5.64"
}
}
二、选择合适的OpenCV包
移动端没有桌面级的完整GUI环境,因此应优先使用opencv-python-headless而非带界面的opencv-python,可减少原生依赖冲突。
- opencv-python-headless:纯计算库,无Qt等界面后端
- opencv-python:包含界面模块,Android下易缺so
版本对应建议
| Chaquopy Python | OpenCV wheel | 说明 |
|---|---|---|
| 3.8 | 4.5.5.64 | 经测试可正常导入 |
| 3.9 | 4.6.0.66 | 需确认abi匹配 |
三、abiFilters与依赖架构
若只配了arm64-v8a但设备是x86模拟器,也会因找不到原生库而导入失败。开发阶段建议加上x86_64以便模拟器调试:
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
}
四、验证导入的Python代码
写一个简单的py文件确认cv2可用:
import cv2
# 读取版本号,验证库加载成功
print("opencv version:", cv2.__version__)
# 创建一个空白图像并转为灰度,测试基础功能
img = cv2.imread("test.png")
if img is not None:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print("shape:", gray.shape)
五、常见报错处理
ModuleNotFoundError: No module named 'cv2'
说明pip未成功安装,清理Chaquopy缓存后重编:删除.build/chaquopy目录再sync。
java.lang.UnsatisfiedLinkError: dlopen failed
一般是abi不全或headless包混用,检查上文abiFilters与包名。
小结
把握Python版本、选对headless包、配齐abi,基本能解决Chaquopy中OpenCV导入失败的问题。