Расширение моего Java API до C ++ через JNI: как обернуть метод, возвращающий строку? - PullRequest
2 голосов
/ 19 августа 2011

Я использую JNI для расширения моего API в Java, чтобы сделать его доступным через C ++ (я создаю классы-оболочки).Я опытный в Java, но плохо знаком с C ++.

Теперь я создаю оболочку в C ++ для функции Java getString (), которая возвращает String.Я использую GetStringUTFChars, чтобы получить строку C из строки Java, но я не знаю, где использовать ReleaseStringUTFChars, которая освобождает строку C.Вот мой код (aClass и aClassInstance являются частными членами даты внутри класса оболочки):

const char* getString() {
jmethodID methodID = env->GetMethodID(aClass,
        "methodName",
        "()Ljava/lang/String;");
if (methodID == NULL) {
    cout << "--methodID = NULL";
    exit(0);
}
jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
const char* result = env->GetStringUTFChars(jstringResult, NULL);
// env->ReleaseStringUTFChars(jstringResult, result); 
return result;
}

Если я удалю // и использую ReleaseStringUTFChars, результат будет освобожден, и я больше не смогу возвращатьэто верно?Должен ли я скопировать результат в другой массив символов перед его выпуском?

Спасибо, любая помощь приветствуется!

K

1 Ответ

5 голосов
/ 19 августа 2011

Махеш прав

std::string getString()
{
    jmethodID methodID = env->GetMethodID(aClass,
        "methodName",
        "()Ljava/lang/String;");
    if (methodID == NULL)
    {
        cout << "--methodID = NULL";
        exit(0);
    }
    jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
    const char* result = env->GetStringUTFChars(jstringResult, NULL);
    std::string result2(result);
    env->ReleaseStringUTFChars(jstringResult, result); 
    return result2;
}

std :: string берет для вас копии ваших символов и автоматически освобождается при необходимости.Использование сырых указателей в C ++ обычно не одобряется.Исходя из Java, вы, вероятно, плохо представляете себе проблемы, которые они могут вызвать.

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