Download Cómputo Móvil Extendiendo Python con Open C
Document related concepts
no text concepts found
Transcript
Cómputo Móvil Extendiendo Python con Open C Dr. Gregorio Toscano Pulido Centro de Investigación y de Estudios Avanzados del IPN. Laboratorio de Tecnologı́as de Información logo Dr. Gregorio Toscano Pulido Cómputo Móvil Extendiendo Python con Open C Los usuarios de Python suelen extender la funcionalidad del intérprete mediante modulos creados en C. Mismos que buscan eficientar el uso de los scripts. Es relativamente fácil y está bien documentado crear programas que colaboren de la mecionada forma. La liga de re referencia obligada es: http://pyspanishdoc.sourceforge.net/ext/ logo Dr. Gregorio Toscano Pulido Cómputo Móvil Instalando la bilioteca de Python en GnuPoc Descarga el SDK correcto desde http://sourceforge.net/projects/pys60 Como nuestros teléfonos implementan la tercera edición de symbian, entonces debemos descargar PythonForS60 1 4 5 SDK 3rdEd.zip Descomprimimos el archivo descargado. Nos generará sdk files.zip y PythonForS60 SDK 3rdEd/uninstall PythonForS60 SDK 3rdEd.cmd, copiamos el primer archivo al directorio que contiene el epoc32 (~/symbian-sdks/s60_31, en mi caso) y descomprimimos el archivo. Listo, ya tenemos instaladas las bibliotecas de Python en GnuPoc. Dr. Gregorio Toscano Pulido Cómputo Móvil logo Ejemplo simple Vamos a crear una función en C que recibe como argumento dos números enteros y regresa la multiplicación de ambos. Creamos los directorios que necesitaremos (group, python, inc, sis y src) Dentro del directorio group creamos los archivos “Makefiles”: bld.inf multiplicador.mmp y los editamos con los datos necesarios. Dentro del directorio inc creamos un archivo de cabecera (multiplicador .h) donde definiremos el prototipo de nuestra función la cuál llamaremos multiplicador. logo Dr. Gregorio Toscano Pulido Cómputo Móvil Ejemplo simple (cont) Dentro del directorio src crearemos el archivo multiplicador .c y wrapper .c cuyo contenido será la función y una interfaz (python-C) respectivamente. Dentro del directorio python creamos el archivo que usará la función. Crearemos el archivo multiplicador .pkg dentro del directorio sis. Aquı́ irán las directivas de creación del archivo SIS. logo Dr. Gregorio Toscano Pulido Cómputo Móvil Manos a la obra mkdir multiplicador cd multiplicador mkdir group python inc sis src touch group/bld.inf group/multiplicador.mmp touch inc/multiplicador.h touch src/multiplicador.c src/wrapper.c touch python/prueba-mul.py touch sis/multiplicador.pkg A continuación describiré cada uno de los archivos. logo Dr. Gregorio Toscano Pulido Cómputo Móvil group/bld.inf PRJ_MMPFILES multiplicador.mmp logo Dr. Gregorio Toscano Pulido Cómputo Móvil group/multiplicador.mmp TARGET TARGETTYPE UID EXPORTUNFROZEN CAPABILITY multiplicador.dll dll 0x00000000 0x0CBDC9B9 LocalServices ReadUserData WriteUserData UserEnviron NOSTRICTDEF USERINCLUDE SYSTEMINCLUDE SYSTEMINCLUDE SYSTEMINCLUDE ..\inc \epoc32\include \epoc32\include\stdapis \epoc32\include\python logo Dr. Gregorio Toscano Pulido Cómputo Móvil group/multiplicador.mmp (cont) SOURCEPATH ..\src SOURCE SOURCE multiplicador.c wrapper.c LIBRARY LIBRARY LIBRARY libc.lib euser.lib python222.lib logo Dr. Gregorio Toscano Pulido Cómputo Móvil inc/multiplicador.h #ifndef MULTIPLICADOR_H #define MULTIPLICADOR_H extern int mutiplicador(int a, int b); #endif logo Dr. Gregorio Toscano Pulido Cómputo Móvil src/wrapper.c #include <Python.h> #include "multiplicador.h" static PyObject* multiplicador_wrapper(PyObject* self, PyObject* args) { int a,b,res; PyObject* result; if (!PyArg_ParseTuple(args, "ii", &a, &b)) return NULL; res=multiplicador(a,b); result = Py_BuildValue("i", res); if (!result) return PyErr_NoMemory(); return result; } logo Dr. Gregorio Toscano Pulido Cómputo Móvil src/wrapper.c (cont) static const PyMethodDef multiplicadorMethods[] = { {"multiplicador", multiplicador_wrapper, METH_VARARGS}, {NULL, NULL} }; DL_EXPORT(void) initmultiplicador(void) { (void)Py_InitModule("multiplicador", multiplicadorMethods); } logo Dr. Gregorio Toscano Pulido Cómputo Móvil src/multiplicador.c #include <stddef.h> int multiplicador(int a,int b) { return a*b; } logo Dr. Gregorio Toscano Pulido Cómputo Móvil python/prueba-mul.py import multiplicador a=3 b=100 c=multiplicador.multiplicador(a,b) print c logo Dr. Gregorio Toscano Pulido Cómputo Móvil sis/multiplicador.pkg ; Installation file for multiplicador application ; ;Language - standard language definitions &EN ; standard SIS file header #{"Multiplicador"},(0xEE0D12D6),1,0,0, TYPE=SA ;Localised Vendor name %{"Vendor-EN"} logo Dr. Gregorio Toscano Pulido Cómputo Móvil sis/multiplicador.pkg (cont) ;Unique Vendor name :"Vendor" ;Supports Series 60 v 3.0 [0x101F7961], 0, 0, 0, {"Series60ProductID"} ;Files to install ;You should change the source paths to match that of your environment ;<source> <destination> "../../../epoc32/release/gcce/urel/multiplicador.dll" -"C:\sys\bin\multiplicador.pyd" logo Dr. Gregorio Toscano Pulido Cómputo Móvil Compilando el código: export PATH=~/gnupoc:${PATH} export EPOCROOT=~/symbian-sdks/s60_31/ cd group echo "##############################################" echo "Inicia Compilacin" echo "##############################################" echo "################## bldmake bldfiles echo "################## abld makefile gcce echo "################## abld reallyclean gcce echo "################## abld build gcce urel bldmake bldfiles" abld makefile gcce" abld reallyclean gcce" abld build gcce urel " Dr. Gregorio Toscano Pulido logo Cómputo Móvil Compilando el código (cont): Atención: necesitamos tener los archivos mycert.cer y mykey.key en el directorio sis echo "##############################################" echo "Crea .sis y lo firma" echo "##############################################" cd ../sis makesis multiplicador.pkg multiplicador.sis signsis multiplicador.sis multiplicador.sisx mycert.cer mykey.key logo Dr. Gregorio Toscano Pulido Cómputo Móvil Error e32def.h Hay un error en el código del archivo epoc32/include/e32def .h, Busca la lı́nea: static const char* const KSuppressPlatSecDiagnostic = KSuppressPlatSecDiagnosticMagicValue; y modifı́cala por: #if defined(__cplusplus) static const char* const KSuppressPlatSecDiagnostic = KSuppressPlatSecDiagnosticMagicValue; #endif logo Dr. Gregorio Toscano Pulido Cómputo Móvil Copia los archivos SIS y Python en el teléfono. Instala el archivo SIS Ejecuta el archivo Python y voilá. logo Dr. Gregorio Toscano Pulido Cómputo Móvil