设为首页 收藏本站
查看: 2032|回复: 0

[经验分享] 用Android NDK r6编译Python 3.2

[复制链接]

尚未签到

发表于 2015-4-24 07:36:08 | 显示全部楼层 |阅读模式
  转载请注明出处为KlayGE游戏引擎
  
  本文的目的不是为了完整地把Python 3.2移植到Android,只是希望编译出能用在自己程序里的链接库。
  完成boost 1.47的移植之后,下一个目标就是Python 3.2。目前Python只有2.6.2非官方地移植到了Android(见P4A),他们迟迟不开始移植3.x,主要原因是他们认为3.x没用-_-。看来这件事情只能自己做了。由于Python 3.x和之前的版本有着巨大的区别,其难度完全不可预测。
准备工作
  需要下载

  • Python 3.2.0
  • Crystax’s NDK r6
  • Cygwin
  • P4A
configure
  按照linux平台的老习惯,很多配置是写在.in文件中,需要用configure来生成出对应的.c或者.h。这里需要特别注意的是,需要让configure用NDK的工具链:
  ./configure –host=arm-linux-androideabi CC=arm-linux-androideabi-gcc CPPFLAGS=”-I$ANDROID_NDK/platforms/android-9/arch-arm/usr/include -I$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/include -I$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I$ANDROID_NDK/sources/crystax/include” CFLAGS=”-nostdlib” LDFLAGS=”-Wl,-rpath-link=$ANDROID_NDK/platforms/android-9/arch-arm/usr/lib -L$ANDROID_NDK/platforms/android-9/arch-arm/usr/lib” LIBS=”-lc”
  其中$ANDROID_NDK是环境变量,指向NDK的根目录。
  经过configure,pyconfig.h、config.c等文件被生成出来了。需要手工把pyconfig.h拷贝到Include目录下。
工程文件
  和boost不一样的是,python没有自带bjam这样的编译工具,所以得自己建立一个Android.mk。我拿了P4A的Android.mk进行一番修改,加入3.2新增的一些.c文件。
打补丁
  P4A提供了一个Python-2.6.2-android.patch,但仅仅适用于2.6.2,毕竟3.x和2.x差异太大了。这里需要修改Python 3.2的源代码,手工把一个个补丁打上。注意pyconfig.h和config.c就不用改了。
编译
  ndk-build进行编译,刚开始一切顺利,接着问题出现。首先出现编译错误的是Objects/unicodeobject.c。在有 wchar的情况下,它需要有PY_FORMAT_LONG_LONG的定义。但不知为何,configure并没有生成正确的 PY_FORMAT_LONG_LONG。于是我加上了一行
  #define PY_FORMAT_LONG_LONG "ll"
  接着Modules/posixmodule.c编译错误。经过细致的检查,我发现是因为在configure生成pyconfig.h中,包含了
  #define HAVE_DEV_PTMX 1
  但在P4A的pyconfig.h中,这里是
  #undef HAVE_DEV_PTMX
  可能的原因似乎Cygwin支持/dev/ptmx,但Android不支持。所以configure根据Cygwin的情况就错误地定义了HAVE_DEV_PTMX。同样多情况还有HAVE_KILLPG,也得#undef掉。
  最棘手的当属Modules/posixmodule.c说找不到fdatasync的编译错误。这个函数定义在$ANDROID_NDK /platforms/android-9/arch-arm/usr/include/unistd.h中,这个目录也已经添加到了 Android.mk中,不应该找不到才对。通过使用ndk-build NDK_LOG=1 V=1来仔细查看每个步骤发现,NDK默认使用了android-3的API,即使你定义了LOCAL_C_INCLUDES也没用。所以它其实包含的是 android-3下的unistd.h,而android-3是不支持fdatasync的,那个函数被放在#if 0中。于是我不得不添加了一个Application.mk,内容只有一行:
  APP_PLATFORM := android-9
  至此,Python 3.2已经可以用NDK编译,生成libpython3.2.so了。
还能用VC编译吗?
  我仍然希望同一份源代码也能用VC编译生成Windows版的Python。这基本上只有一个问题,Android的pyconfig.h和 Windows的pyconfig.h不同。于是我把前者命名为pyconfig.android.h,后者命名为pyconfig.win.h,并分别 在编译脚本和Pre-Build Event里把对应的pyconfig.xxx.h覆盖拷贝成pyconfig.h。这样一来,不同的编译系统就都可以顺利编译了。
合在一起
  在附件里面你可以找到所有我修改过的文件。在编译之前,你必须设置一个环境变量,名字为“ANDROID_NDK”,只想你的NDK根目录。
  Python_for_android_patches.7z

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60091-1-1.html 上篇帖子: 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(中) 下篇帖子: python爬虫实现(使用线程池)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表