damonkohler / sl4a

SL4A brings scripting languages to Android by allowing you to edit and execute scripts and interactive interpreters directly on the Android device.
Apache License 2.0
2.44k stars 800 forks source link

ctypes module for python ASE #243

Open damonkohler opened 9 years ago

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

What steps will reproduce the problem?
1. import ctypes
2. error
3. unable to import ctypes stdlib module

What is the expected output? What do you see instead?
ctypes module for python correctly imported

What version of the product are you using? On what operating system?
x

Please provide any additional information below.
x

Original issue reported on code.google.com by kpo...@gmail.com on 30 Apr 2010 at 4:58

Copied from original issue: damonkohler/android-scripting#317

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

Issue 324 has been merged into this issue.

Original comment by damonkoh...@gmail.com on 2 May 2010 at 5:54

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

more specifically:

>>> import ctypes
import ctypes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File
"/home/damonkohler/ase_src/python/src/android/python/lib/python2.6/ctypes/__init
__.py",
line 10, in <module>
ImportError: No module named _ctypes
>>> import _ctypes

Original comment by kpo...@gmail.com on 2 May 2010 at 5:57

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

Original comment by damonkoh...@gmail.com on 2 May 2010 at 3:17

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

This is part of python stdlib ! not an enhancement ! :)

Original comment by kpo...@gmail.com on 3 May 2010 at 1:57

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

can we support Structures /unions first?

Original comment by feifan....@gmail.com on 27 Sep 2010 at 11:40

damonkohler commented 9 years ago

From @GoogleCodeExporter on May 31, 2015 11:26

I've received a patch to make ctypes work:

1. wchar_t is not properly supported on Android, and so Python-2.6.2/pyconfig.h 
must be configured appropriately by #undef'ing HAVE_USABLE_WCHAR_T and 
HAVE_WCHAR_H

2. ctypes expects dlopen(NULL) to return a handle to the python application; 
the Android linker doesn't support this. I think a proper solution to this 
(aside from patching the linker, which won't help people with current builds) 
involves building python in two parts: executable and .so, and patching 
ctypes/__init__.py to load the .so, as it does with cygwin. In the meantime, 
here is the workaround I am using:

--- Lib/ctypes/__init__.py    2010-10-20 13:03:54.000000000 -0700
+++ /Users/bluremployee/Desktop/Python-2.6.2/Lib/ctypes/__init__.py    
2008-08-14 12:10:48.000000000 -0700
@@ -438,10 +438,7 @@
 elif _sys.platform == "cygwin":
     pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
 else:
-    # On Android, dlopen(NULL) doesn't return a handle to the application
-    # as this code expects.
-    # pythonapi = PyDLL(None)
-    pass
+    pythonapi = PyDLL(None)

 if _os.name in ("nt", "ce"):

Attached is an archive with a hacked together tree that builds a working 
_ctypes.so. It builds under the Android NDK. Also attached is the full version 
of ctypes/__init__.py for Python 2.6.2.

And here's a sample interactive session on the device:

# PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python/ 
PYTHONPATH="/sdcard/sl4a/scripts:/sdcard/com.googlecode.pythonforandroid/extras/
python:/data/data/com.googlecode.pythonforandroid/files/python/lib/python26.zip:
/data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6:/data/data
/com.googlecode.pythonforandroid/files/python/lib/python2.6/plat-linux2:/data/da
ta/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-tk:/data/data/
com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-old:/data/data/co
m.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload" 
/data/data/com.googlecode.pythonforandroid/files/python/bin/python  
Python 2.6.2 (r262:71600, Sep 19 2009, 11:03:28) 
[GCC 4.2.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> liblog=ctypes.cdll.LoadLibrary('liblog.so')
>>> liblog.__android_log_write(3, 'sl4a', 'ctypes works!')
20
>>> libc=ctypes.cdll.LoadLibrary('libc.so')
>>> libc.printf('hello %s\n', 'world')
hello world
12

Original comment by damonkoh...@gmail.com on 6 Nov 2010 at 6:07

Attachments: