Возможно, вам нужно выделить массив для начала.
Это означает создание объекта массива с достаточной длиной NewLongArray (), использование SetLongArrayRegion () для заполнения объекта массива, а затем использование SetObjectField () для установкиновый экземпляр массива в java-объект (исключая старый).
Вы можете быстро проверить эту теорию, убедившись, что в Java вы выделите достаточно большой массив перед вызовом JNI для его заполнения.
int SIZE = 1000; // make this big enough
J j = new J();
j.nls = new long[SIZE];
j.lane = new long[SIZE][SIZE]; // something like this multi-dimention array
j.t = new long[SIZE];
int i = callMyJniMethod(j);
Теперь попробуйте свои идеи GetField, SetLongArrayRegion.Убедившись, что num_states <1000. </p>
Как только вы докажете, что это начинает работать, вы можете работать над тем, как именно вы хотите, чтобы ваш API работал.Идеи по этому поводу:
Сохраните текущий дизайн, но JNI выделит массив.
Создайте новый объект Java "AA" иJNI устанавливает один для каждого C ++ «aa» и заполняет его, а затем присоединяет массив BB (aka J) к объекту J.j.aa = новый AA [num_states];
FWIW вы пытаетесь скопировать данные между C ++ / Java (не картой, так как использование карты терминов подразумевает некоторый обмен, обновлениеодин не будет обновлять другой, если вы не скопируете его заново)
FWIW "long" в C / C ++, возможно, 32-битный на вашей платформе, но "long" в Java всегда 64-битный.