如何在android python 打包上运行Python代码

编程开发子分类如何从Python代码中直接访问Android的Service_Linux编程_Linux公社-Linux系统门户网站
你好,游客
如何从Python代码中直接访问Android的Service
来源:Linux社区&
作者:i2cbus
在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制。但是在Python对象和Java对象中转来转去总让人感觉到十分别扭。好在提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接访问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也同样可以在Python中封装同样的C++代码,这篇文章讲解了如何通过binder在Python代码中直接访问Java的Service,如WifiService。
《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]
《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]
Python脚本获取Linux系统信息
在下用Python搭建桌面算法交易研究环境
binder_wrap.h
#ifndef BINDER_WRAP_H&
#define BINDER_WRAP_H&
#ifdef __cplusplus&
extern "C" {&
typedef int (*vector_visitor)(const char16_t* str16,int length,void *data);&
typedef int (*fnOnTransact)(uint32_t code,const void *data,void *reply,uint32_t flags,void *userData);&
int server_create(const char *name,const char *descriptor,fnOnTransact onTrans,void *data);&
void* binder_getbinder(const char *name);&
int binder_releasebinder(void* binder);&
int binder_listServices(vector_visitor visitor,void *data);&
int binder_getInterfaceDescriptor(void *binder,char16_t *descriptor,size_t size);&
int binder_transact(void* binder,int code,const void *data,void* reply,int flags);&
void* parcel_new();&
int parcel_destroy(void* parcel);&
int parcel_writeInterfaceToken(void* parcel,const char *interface);&
int parcel_writeInt32(void *parcel,int val);&
int parcel_writeCString(void *parcel,const char* str);&
int parcel_writeString16(void *parcel,const char16_t* str, size_t len);&
int parcel_readInt32(void *parcel);&
long parcel_readInt64(void *parcel);&
int parcel_readString16(void *parcel,char16_t* str, size_t len);&
int parcel_readInplace(void *parcel,void* data, int len);&
int parcel_readExceptionCode(void *parcel);&
int parcel_dataAvail(void *parcel);&
#ifdef __cplusplus&
binder_wrap.cpp
#include &sys/types.h&&
#include &unistd.h&&
#include &grp.h&&
#include &binder/IPCThreadState.h&&
#include &binder/ProcessState.h&&
#include &binder/IServiceManager.h&&
#include &utils/Log.h&&
#include &binder/Parcel.h&&
#include "binder_wrap.h"&
void* binder_getbinder(const char *name)&
& & android::sp&android::IServiceManager& sm = android::defaultServiceManager();&
& & sp&IBinder& *binder = new sp&IBinder&();&
& & & & *binder = sm-&getService(android::String16(name));&
& & & & if (binder != 0)&
& & & & {&
& & & & & &&
& & & & }&
& & & & usleep(500000); // 0.5 s&
& & } while(true);&
& & return reinterpret_cast&void *&(binder);&
int binder_releasebinder(void* binder)&
& & sp&IBinder& *bp = reinterpret_cast&sp&IBinder& *&(binder);&
& & if(bp == 0)&
& & & & return 0;&
& & return 1;&
//Vector&String16&& & listServices() = 0;&
int binder_listServices(vector_visitor visitor,void *data)&
& & android::sp&android::IServiceManager& sm = android::defaultServiceManager();&
& & Vector&String16& list = sm-&listServices();&
& & for (int i=0;i&list.size();i++)&
& & & & visitor(list[i].string(),list[i].size(),data);&
& & return list.size();&
int binder_getInterfaceDescriptor(void *binder,char16_t *descriptor,size_t size)&
& & sp&IBinder& *bp = reinterpret_cast&sp&IBinder& *&(binder);&
& & if(bp == 0)&
& & & & return 0;&
& & if (descriptor == NULL || size &= 0)&
& & & & return 0;&
& & String16 des = (*bp)-&getInterfaceDescriptor();&
& & if (size & des.size())&
& & & & size = des.size();&
& & memcpy(descriptor,des.string(),size*2);&
//int binder_transact(void* binder,int code,const Parcel& data,Parcel* reply,int flags = 0)&
int binder_transact(void* binder,int code,const void *data,void* reply,int flags)&
& & sp&IBinder& *bp = reinterpret_cast&sp&IBinder& *&(binder);&
& & if(bp == 0 || data == 0 || reply == 0)&
& & & & return 0;&
& & return (*bp)-&transact(code,*(Parcel*)data,(Parcel*)reply,flags);&
void* parcel_new()&
& & return (void*)new Parcel();&
int parcel_destroy(void* parcel)&
& & if(parcel == 0)&
& & & & return 0;&
& & delete (Parcel*)&
& & return 1;&
int parcel_writeInterfaceToken(void* parcel,const char *interface)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&writeInterfaceToken(String16(interface));&
int parcel_writeInt32(void *parcel,int val)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&writeInt32(val);&
int parcel_writeCString(void *parcel,const char* str)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&writeCString(str);&
int parcel_writeString16(void *parcel,const char16_t* str, size_t len)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & if (str == 0 || len &= 0)&
& & & & return 0;&
& & return p-&writeString16(str,len);&
int parcel_readInt32(void *parcel)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&readInt32();&
long parcel_readInt64(void *parcel)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&readInt64();&
int parcel_readString16(void *parcel,char16_t* str, size_t len)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & if (str == NULL || len &= 0)&
& & & & return 0;&
& & String16 str16 = p-&readString16();&
& & if (len & str16.size())&
& & & & len = str16.size();&
& & memcpy(str,str16.string(),len*2);&
int parcel_readExceptionCode(void *parcel)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&readExceptionCode();&
int parcel_readInplace(void *parcel,void* data, int len)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & if (len &= 0 && len &= (int32_t)p-&dataAvail())&
& & & & const void *d = p-&readInplace(len);&
& & & & memcpy(data,d,len);&
& & return 0;&
int parcel_dataAvail(void *parcel)&
& & Parcel *p = reinterpret_cast&Parcel *&(parcel);&
& & if(p == 0)&
& & & & return 0;&
& & return p-&dataAvail();&
更多详情见请继续阅读下一页的精彩内容:
相关资讯 & & &
& (05/15/:52)
& (02/09/:35)
& (05月24日)
& (05/14/:38)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款QPython+ 为Andorid量身定做的Python6307人阅读
在应用商店下载安装“超级终端”或“终端模拟器”等Android终端软件,如此保证你能使用命令行操控你的设备
在应用商店下载安装好Busybox,并且symlink好busybox的所有命令
注:未symlink的busybox命令只能以形如“busybox 命令名称”的方式调用,例如
busybox killall
当symlink好以后,可以直接在终端中输入“命令名称”即可调用命令,例如
在/p/python-for-android/页面下载PythonForAndroid安装包安装到你的手机,本人下载的是
运行手机中的pythonForAndroid,点击Install等待安装自动完成
Android中运行python并不能像Linux中一样直接敲进python就执行python,这里还需要一个sh来配置环境才能让python运行起来,本人机器中的sh脚本内容如下:
#! /system/bin/sh
mkdir /data/tmp
mount -t tmpfs tmpfs /data/tmp
chmod 1777 /data/tmp
export EXTERNAL_STORAGE=/mnt/sdcard
PYTHONPATH=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python
PYTHONPATH=${PYTHONPATH}:/data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload
export PYTHONPATH
export TEMP=/data/tmp
export PYTHON_EGG_CACHE=$TEMP
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python
export LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/files/python/lib
/data/data/com.googlecode.pythonforandroid/files/python/bin/python &$@&
上面的代码对于不同人的机器可能要做一些修改,主要是有些人的手机在安装python后,sd卡并不在/mnt/sdcard路径下,这时候你必须把第6、7行中/mnt/sdcard的内容替换成你的sd卡的路径。
将上面的脚本保存到sd卡中,比如sd卡根目录中命名为python.sh
这样在终端运行时,可以输入以下命令以运行python:
cd /mnt/sdcard
sh python.sh
详情请参考,注意文章和下面的讨论:/p/python-for-android/wiki/RunPythonFromShell
对于部分机型,使用sh python.sh的办法尚不能正确将Python运行起来
错误提示:&could not load needed library 'libpython2.6.so' for '/data/data/com.googlecode.pythonforandroid/files/python/bin/python' (load_library[1091]: Library 'libpython2.6.so' not found)CANNOT LINK EXECUTABLE
这时只能将python.sh内的所有内容复制输入到“终端模拟器”以运行python,目前本人暂不明确出现这种问题的原因,望交流。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:360126次
积分:4179
积分:4179
排名:第3700名
原创:69篇
转载:41篇
评论:95条
(1)(3)(5)(1)(1)(1)(1)(1)(2)(2)(5)(1)(2)(3)(3)(9)(1)(5)(5)(9)(12)(26)(10)(3)(1)

我要回帖

更多关于 android python脚本 的文章

 

随机推荐