Передача байтового массива C # в плагин Android для собственной библиотеки C / C ++ - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над передачей изображения, хранящегося в виде массива цветов 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?Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...