Ваши последние два вопроса связаны, поэтому я отвечу на них вместе.
PyObject array1 = PyObject.fromJava(bytes)
py_module.callAttr("pic_func", array1)
Передается по ссылке: код Python получает объект jarray
, который обращается к исходному массиву.
np.array(o)
np.array
всегда делает копию, и в этом случае это будет медленная копия, потому что к массиву нужно обращаться по одному элементу за раз через JNI. Вы можете избежать этого, сначала преобразовав объект Python bytes
, что можно сделать на любом языке:
- В Java:
PyObject array1 = py.getBuiltins().callAttr("bytes", bytes)
- Или в Python:
np.array(bytes(o))
Это фактически приведет к созданию дополнительной копии, но поскольку все копии теперь можно выполнять с помощью прямой копии в памяти, это будет намного быстрее.
b.tobytes()
toJava(byte[].class)
Оба эти выражения также сделают копию, но они также будут прямыми копиями памяти, поэтому производительность не должна быть проблемой.
Что касается возврата неправильного ответа, я думаю, это возможно потому, что NumPy использует тип данных по умолчанию float64
. При вызове np.array
вы должны явно указать тип данных, передав dtype=np.int8
или dtype=np.uint8
. (Если вы ищете byte[]
в документации Chaquopy , вы найдете точную информацию о том, как работает преобразование со знаком / без знака, но, вероятно, проще просто попробовать оба варианта и посмотреть, какой из них дает ожидаемый ответ .)