This is tricky in ctypes because ctypes function pointers do not implement the .value
property used to set other pointers. Instead, cast your callback function and the extern function pointer to void *
with the c_void_p
function. After setting the function pointer as void *
as shown, C can call your Python function, and you can retrieve the function as a function pointer and call it with normal ctypes calls.
from ctypes import *
liblibrary = cdll.LoadLibrary('liblibrary.so')
def py_library_hook(strings, n):
return 0
# First argument to CFUNCTYPE is the return type:
LIBRARY_HOOK_FUNC = CFUNCTYPE(c_int, POINTER(c_char_p), c_int)
hook = LIBRARY_HOOK_FUNC(py_library_Hook)
ptr = c_void_p.in_dll(liblibrary, 'library_hook')
ptr.value = cast(hook, c_void_p).value