Я работаю над передачей изображения, хранящегося в виде массива цветов RGBA в 32-битном формате, из C # в собственный плагин для Android, написанный на C / C ++ и упакованный в общую библиотеку.Моя попытка состояла в том, чтобы распутать цвета в расширенный байтовый массив и передать его нативной функции с параметром JNI jbooleanArray, поскольку JNI typedef unsigned char как jboolean.Однако данные не пересекают неуправляемую границу должным образом: я получаю SEGFAULT, когда я вызываю GetBooleanArrayElements .Кроме того, высота изображения int, переданного в качестве параметра jint в той же функции, становится отрицательной, чего не было изначально.Я предполагаю, что есть некоторые проблемы с выравниванием / заполнением памяти, выбрасывающие все из строя.
Это функция библиотеки C:
JNIEXPORT void JNICALL Detect(JNIEnv* env, jobject jobj, jbooleanArray rawImagePixelsUnraveled, jint imageWidth, jint imageHeight, jint maxDetectedShapes, jintArray outDetectedShapesCountSingleArray, jintArray outPointsPerShapeArray)
{
//assert(imageHeight >= 0);
jboolean isRawImagePixelsUnraveledCopy;
jboolean* rawImagePixelsUnraveledArray = env->GetBooleanArrayElements(rawImagePixelsUnraveled, &isRawImagePixelsUnraveledCopy);
...
}
Это соответствующий вызывающий код C #:
byte[] rawImagePixelsUnraveled = OpenCVInterop.Color32ArrayUnraveled(rawImagePixels);
IntPtr unmanagedArray = Marshal.AllocHGlobal(rawImagePixelsUnraveled.Length);
Marshal.Copy(rawImagePixelsUnraveled, 0, unmanagedArray, rawImagePixelsUnraveled.Length);
OpenCVInterop.Detect(unmanagedArray, phoneCameraDisplay.RenderingCameraTexture.width, phoneCameraDisplay.RenderingCameraTexture.height, _maxShapeDetectCount, ref _detectedShapesCount, _pointsPerShape);
Marshal.FreeHGlobal(unmanagedArray);
internal static class OpenCVInterop
{
static internal byte[] Color32ArrayUnraveled(Color32[] color32Array)
{
byte[] unraveledColor32Array = new byte[color32Array.Length * 4];
for(int i = 0; i < color32Array.Length; ++i)
{
unraveledColor32Array[4 * i] = color32Array[i].r;
unraveledColor32Array[4 * i + 1] = color32Array[i].g;
unraveledColor32Array[4 * i + 2] = color32Array[i].b;
unraveledColor32Array[4 * i + 3] = color32Array[i].a;
}
return unraveledColor32Array;
}
[DllImport("native-lib")]
internal static extern void Detect(IntPtr/*byte[]*/ rawImagePixels, int imageWidth, int imageHeight, int maxOutShapesCount, ref int outDetectedShapesCount, int[] outPointsPerShape);
}
Я попытался отправить сам байтовый массив и скопировать его в IntPtr, но безуспешно.Как правильно отправить байтовый массив из C # в C-land?Спасибо.