Вы должны освободить указатели array1, как только закончите с ними.Что эта функция делает в реальности?Из функциональности, которую я понял, вы копируете из Java в AC-указатель.Что происходит дальше?Вызывая ReleaseStringUTF, вы уведомляете JVM о том, что он не используется в нативном режиме и поэтому может быть GCed при необходимости
Думаю, я обнаружил проблему.Выпуск кода должен быть примерно таким:
for (int j=0 ;j<length; j++ )
{
free(array1[j]);
}
free(array1);
Первоначальное распределение должно быть array1 = (char **)malloc(length * sizeof(int *));
Разница составляет int*
вместо char*
.Это потому, что этот массив является просто массивом указателей.Размер указателя int.Следующий уровень находится в цикле, где вы выделяете память для ваших строк.Это должно быть array1[i] = (char *)malloc(numberOfCharsInThisRow * sizeof(char));
Это означает, что изначально вы выделили массив указателей.Теперь для каждого элемента этой статьи вы выделяете память для хранения своей собственной строки.Я думаю, что даже *(array1+i)
будет работать, но я считаю, что это легче читать.Поэтому, когда вы освобождаете, сначала вы освобождаете отдельные элементы массива, которые вы разместили, а затем весь массив, который вы выделили изначально.Как пример, взгляните на вашу текущую функцию освобождения.Нет разницы между свободным при j = 0 и последним свободным.Я удивлен, что вы не получаете никаких сбоев.
Взгляните на http://c -faq.com / ~ scs / cclass / int / sx9b.html
Также попробуйтеследующий jstring myString =env->GetObjectArrayElement(my_obj,i)
;Используйте myString для получения UTFChars, затем вызовите env->ReleaseStringUTFChars(mystring, cstr)