Java.lang.IllegalArgumentException в нативных функциях (embedded Java, MicroEJ, STM32F4Discovery)

Добрый день!

Пытаюсь связать embedded Java и C посредством нативных функций.

Идея в следующем: мне нужно вернуть из нативной функции 4 примитивных (int) значения - 1 возвращаемое и 3 посредством параметров.

В Java примитивные типы можно передать только "по значению", и, значит, изменения внутри функции не смогу увидеть снаружи. Но можно использовать массивы примитивных типов, и тогда изменения в элементах массива вполне можно увидеть после вызова функции.

Это подтверждает код:

JavaВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

  private static int testArrayFunk(int[] arr)
  {
    arr[0] = 6;
    arr[1] = 0;
    arr[2] = -11;
 
    return 7;
  }
 
  private static void test(int a, int b, int c)
  {
  }
.............
  int[] arr = new int[3];
  arr[0] = arr[1] = arr[2] = 0; 
 
  test(arr[0], arr[1], arr[2]); // a = 0, b = 0, c = 0
  testArrayFunk(arr);
  test(arr[0], arr[1], arr[2]); // a = 6, b = 0, c = -11

Но если testArrayFunk объявить как нативную

JavaВыделить код

| | |
| --- | --- |
| 1 | public static native int testArrayFunk (int[] arr); |

и на C уровне написать реализацию этой нативной функции при условии, что

CВыделить код

1
2
3
4
5
6
7
8

jint Java_com_is2t_examples_microui_leds_LedAnimation_testArrayFunk(jint arr)
{
  arr[0] = 6;
  arr[1] = 0;
  arr[2] = -11;
 
  return 7;
}

, то я получаю java.lang.IllegalArgumentException.

Так же пробовал в нативной функции использовать

и

, но с тем же результатом.

На официальном сайте нужных мне примеров не нашел. И в сети про использование массивов примитивных типов в Java нативных функций не нашел примеров.

Кто может подсказать в чем может быть проблема?

Спасибо.