Search code examples
c++java-native-interface

What may be the easiest way to append multiple jstrings in JNI?


I'm working on an android app where I need to append 5-6 jstrings and want to return a single jstring in native code. Strings are like...

jstring1= "Hello, "
jstring2= "How"
jstring3= "are"
jstring4= "you"
jstring5= "today?"

and I want to return a jstring like, "Hello, how are you today?" I'm Just wandering to know the easiest way to do it.


Solution

  • First, you make a StringBuilder:

    jclass cls_StringBuilder = env->FindClass("java/lang/StringBuilder");
    jmethodID ctr_StringBuilder = env->GetMethodID(cls_StringBuilder, "<init>", "(I)V");
    jobject stringBuilder = env->NewObject(cls_StringBuilder, ctr_StringBuilder, 100);
    

    And then you append string by string:

    jmethodID mid_StringBuilder_append = env->GetMethodID(cls_StringBuilder, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    for (auto str: { jstring1, jstring2, jstring3, jstring4, jstring5 }) {
      env->CallObjectMethod(stringBuilder, mid_StringBuilder_append, str);
    }
    

    Finally grab the contents of the StringBuilder:

    jmethodID mid_StringBuilder_toString = env->GetMethodID(cls_StringBuilder, "toString", "()Ljava/lang/String;");
    jstring final = (jstring) env->CallObjectMethod(stringBuilder, mid_StringBuilder_toString);
    return final;