@@ -29,9 +29,21 @@ inline std::string GetStringFromJString(JNIEnv* env, jstring jstr) {
2929 if (jstr == nullptr ) {
3030 return std::string ();
3131 }
32- const char * c_str = env->GetStringUTFChars (jstr, JNI_FALSE);
33- std::string str = std::string (c_str);
34- env->ReleaseStringUTFChars (jstr, c_str);
32+
33+ // TODO: cache reflection to improve performance
34+ const jclass string_class = env->GetObjectClass (jstr);
35+ const jmethodID getbytes_method = env->GetMethodID (string_class, " getBytes" , " (Ljava/lang/String;)[B" );
36+
37+ const jstring charset = env->NewStringUTF (" UTF-8" );
38+ const jbyteArray jbytes = (jbyteArray) env->CallObjectMethod (jstr, getbytes_method, charset);
39+ env->DeleteLocalRef (charset);
40+
41+ const jsize length = env->GetArrayLength (jbytes);
42+ jbyte* c_str = env->GetByteArrayElements (jbytes, NULL );
43+ std::string str = std::string (reinterpret_cast <const char *>(c_str), length);
44+
45+ env->ReleaseByteArrayElements (jbytes, c_str, RELEASE_MODE);
46+ env->DeleteLocalRef (jbytes);
3547 return str;
3648}
3749
@@ -100,9 +112,23 @@ inline std::vector<std::string> GetVecFromJStringArray(JNIEnv* env, jobjectArray
100112// String[]
101113inline jobjectArray GetStringArrayFromVec (JNIEnv* env, const std::vector <std::string> &vec) {
102114 jobjectArray array = env->NewObjectArray (vec.size (), env->FindClass (" Ljava/lang/String;" ), nullptr );
115+
116+ // TODO: cache reflection to improve performance
117+ const jclass string_class = env->FindClass (" java/lang/String" );
118+ const jmethodID ctor = env->GetMethodID (string_class, " <init>" , " ([BLjava/lang/String;)V" );
119+ const jstring charset = env->NewStringUTF (" UTF-8" );
120+
103121 for (int i = 0 ; i < vec.size (); ++i) {
104- env->SetObjectArrayElement (array, i, env->NewStringUTF (vec[i].c_str ()));
122+ const char * c_str = vec[i].c_str ();
123+ int len = vec[i].length ();
124+ auto jbytes = env->NewByteArray (len);
125+ env->SetByteArrayRegion (jbytes, 0 , len, reinterpret_cast <const jbyte*>(c_str));
126+ jobject jstr = env->NewObject (string_class, ctor, jbytes, charset);
127+ env->DeleteLocalRef (jbytes);
128+ env->SetObjectArrayElement (array, i, jstr);
105129 }
130+
131+ env->DeleteLocalRef (charset);
106132 return array;
107133}
108134
0 commit comments