为Python for Android构建自定义dlib库Recipe后无法导入模块的问题排查
我帮你梳理了几个可能遗漏的关键步骤,你可以逐一排查:
确认Python模块文件是否正确部署
你现在只复制了底层的libdlib.so,但Python导入需要的是dlib的Python绑定模块(通常也是一个叫dlib.so的文件,和底层库同名,但作用完全不同)。你需要检查目标平台的site-packages目录(路径大概是.buildozer/android/platform/build-armeabi-v7a/build/python-installs/<APP>/armeabi-v7a/site-packages)里是否存在这个Python模块文件。如果没有,说明cmake的安装步骤没把它放对地方,需要手动复制。补全Recipe的关键属性
继承CppCompiledComponentsPythonRecipe需要补充几个必要配置,添加到你的DlibRecipe类中:install_in_hostpython = False # 不要安装到主机Python,只针对目标平台 need_stl = True # dlib依赖C++ STL,必须开启修正CMake的安装路径参数
你当前用的self.ctx.get_site_packages_dir()指向的是主机Python的site-packages,不是Android目标平台的。应该替换成目标平台的路径:# 替换原来的DDLIB_PYTHON{major}_INSTALL_PATH参数 target_site_packages = join(self.ctx.get_python_install_dir(arch.arch), 'site-packages') # 然后在cmake参数里用这个变量 '-DDLIB_PYTHON{major}_INSTALL_PATH={site_packages}'.format( major=python_major, site_packages=target_site_packages),另外建议把
-DDLIB_SKIP_PYTHON_LOADER=OFF改成ON,Android下的Python加载逻辑不兼容dlib默认的加载器,跳过它能避免额外的路径问题。手动复制Python模块到目标目录
如果cmake自动安装还是没生效,就在build_arch方法末尾添加手动复制的代码:# 找到编译好的Python绑定模块(路径可能需要根据实际编译结果调整) dlib_python_module = join(build_dir, 'dlib', 'dlib.so') target_site_packages = join(self.ctx.get_python_install_dir(arch.arch), 'site-packages') shprint(sh.cp, dlib_python_module, target_site_packages)调整依赖顺序
numpy是dlib和opencv的前置依赖,在Buildozer的requirements里要把它放在最前面:requirements = kivy==2.0.0,numpy,opencv,dlib这样能确保numpy先编译安装,后续的dlib和opencv才能正确找到它的头文件。
内容的提问来源于stack exchange,提问作者Ne1zvestnyj

