Как из jni-метода вернуть String?
JNIEXPORT jstring JNICALL Java_Test_saySomething(JNIEnv *env, jobject obj, jstring jStr) {
    // Получаем указатель на массив символов String
    const char *cStr = (*env)->GetStringUTFChars(env, jStr, NULL);
    if (cStr == NULL) return NULL;

    // Выводим полученное
    printf("%s\n", cStr);
    // Освобождаем выделенную под строку область памяти
    (*env)->ReleaseStringUTFChars(env, jStr, cStr);
 
    // Получаем новый массив символов от пользователя
    char buf[128];
    scanf("%s", buf);
 
    // Преобразовываем массив символов в String
    return (*env)->NewStringUTF(env, buf);
}
Только учтите, что Java хранит строки в кодировке Modified UTF-8, а в C вы работаете с ANSI-кодировками. Поэтому, если понадобиться работать с кириллицей, то придётся озаботиться перекодированием.
JNIEXPORT jstring JNICALL Java_Test_saySomething(JNIEnv *env, jobject obj, jstring jStr) {
    // Получаем указатель на массив символов String
    const char *cStr = (*env)->GetStringUTFChars(env, jStr, NULL);
    if (cStr == NULL) return NULL;

    // Выводим полученное
    printf("%s\n", cStr);
    // Освобождаем выделенную под строку область памяти
    (*env)->ReleaseStringUTFChars(env, jStr, cStr);
 
    // Получаем новый массив символов от пользователя
    char buf[128];
    scanf("%s", buf);
 
    // Преобразовываем массив символов в String
    return (*env)->NewStringUTF(env, buf);
}
Только учтите, что Java хранит строки в кодировке Modified UTF-8, а в C вы работаете с ANSI-кодировками. Поэтому, если понадобиться работать с кириллицей, то придётся озаботиться перекодированием.