c: char* , malloc, возврат из функции, и снова возврат в Java(jni)

Рейтинг: 0Ответов: 1Опубликовано: 02.04.2015

Хочу попытаться понять ситуацию: Посмотрите код и комментарии:

#include <string.h>
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>

char* getstring(){
    size_t unknown_string_length = 1000; //допустим 1000, но количество на самом деле неизвестно
    char* returned = malloc(unknown_string_length);
    sprintf(returned, "%s", "очень много букв");
    return returned;
}


jstring Java_com_mycompany_myndkapp_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
    char *result = getstring();

    //Когда под переменную выделена память с помощью malloc, то переменную надо освобождать, ОК
    free(result);    
    //но что тогда возвратится в джаву, как поступить в данном случае ? 
    //какие есть способы вообще ?

    return (*env)->NewStringUTF(env, result);
}

Вот как поступить в даном случае , чтобы было правильно ?

Ответы

▲ 1Принят

Передавать уже освобожденную память в функцию, очевидно неверно.

Никогда не писал с JNI, но попробуем разобраться (угадать).

Читаем документацию и видим, что NewStringUTF возвращает сформированный Java string object.

Будем надеяться, что переданные байты копируются куда-то внутрь JVM. Тогда код может выглядеть так:

 jstring Java_com_mycompany_myndkapp_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
 {
   char *result = getstring();
   jstring res = (*env)->NewStringUTF(env, result);

   // Когда под переменную выделена память с помощью malloc, то переменную надо освобождать
   // ОК -- надеемся, что содержимое result[] скопировано
   free(result);    
   // а res (Java string object)  возвратится в джаву
   return res;
 }

Попробуйте, вдруг и в самом деле я угадал.