Это довольно сложно, но не могли бы вы, по крайней мере для этой части кода, использовать решение с чистым типом? В основном, вручную просмотрите символы, экспортируемые из общего файла библиотеки, чтобы найти имя, под которым была экспортирована функция writePixelsRect. В C ++ происходит искажение имен, поэтому, хотя авторы библиотек решили сделать это extern "C"
, это может быть просто writePixelsRect
, но это может быть что-то намного более запутанное, например _Z15writePixelsRectP8JoxColoriiii
(вот как это было экспортировано в фиктивную библиотеку C ++, я просто создано в моей системе).
В Linux эта команда должна сообщить вам имя символа:
nm libjox.so | grep writePixel | cut -d " " -f 3
Затем сохраните эту строку и вставьте ее в код Python примерно так:
from ctypes import *
LIBRARY_NAME = 'libjox.so'
c = cdll.LoadLibrary(LIBRARY_NAME)
WIDTH = 20
HEIGHT = 20
class JoxColor(Structure):
_fields_ = [("r", c_float), ("g", c_float), ("b", c_float), ("a", c_float)]
ColorBlock = JoxColor * (WIDTH * HEIGHT)
data_array = ColorBlock()
color = JoxColor(0, 0, 1, 0)
for i in range(WIDTH * HEIGHT):
data_array[i] = color
c._Z15writePixelsRectP8JoxColoriiii(data_array, 0, 0, WIDTH, HEIGHT)
Предполагая, что _Z15writePixelsRectP8JoxColoriiii
является символом, что функция доступна как в общей библиотеке. Выполнение этого кода просто работало в моей системе с фиктивной библиотекой, подобной этой:
#include <stdio.h>
struct JoxColor {
float r, g, b, a;
};
void writePixelsRect(JoxColor *colors, int left, int top, int width, int height) {
int p = 0;
printf("size: %i, %i\n", width, height);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
JoxColor color = colors[p];
printf("pixel: %f, %f, %f, %f\n", color.r, color.g, color.b, color.a);
}
}
}
Так что я надеюсь, что это не слишком далеко от рабочего кода в вашей среде.