| import com.sun.jna as jna |
| |
| def get_libc(): |
| return CDLL("c") |
| |
| typecode_map = {'h': 2, 'H': 2} |
| |
| class Array(object): |
| def __init__(self, typecode): |
| self.typecode = typecode |
| self.itemsize = typecode_map[typecode] |
| |
| def __call__(self, size, autofree=False): |
| if not autofree: |
| raise Exception |
| return ArrayInstance(self, size) |
| |
| class ArrayInstance(object): |
| def __init__(self, shape, size): |
| self.shape = shape |
| self.alloc = jna.Memory(shape.itemsize * size) |
| |
| def __setitem__(self, index, value): |
| self.alloc.setShort(index, value) |
| |
| def __getitem__(self, index): |
| return self.alloc.getShort(index) |
| |
| class FuncPtr(object): |
| def __init__(self, fn, name, argtypes, restype): |
| self.fn = fn |
| self.name = name |
| self.argtypes = argtypes |
| self.restype = restype |
| |
| def __call__(self, *args): |
| container = Array('H')(1, autofree=True) |
| container[0] = self.fn.invokeInt([i[0] for i in args]) |
| return container |
| |
| class CDLL(object): |
| def __init__(self, libname): |
| self.lib = jna.NativeLibrary.getInstance(libname) |
| self.cache = dict() |
| |
| def ptr(self, name, argtypes, restype): |
| key = (name, tuple(argtypes), restype) |
| try: |
| return self.cache[key] |
| except KeyError: |
| fn = self.lib.getFunction(name) |
| fnp = FuncPtr(fn, name, argtypes, restype) |
| self.cache[key] = fnp |
| return fnp |