@@ -65,9 +65,21 @@ void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fiel
6565}
6666
6767std::string javaToString (JNIEnv *env, jstring str) {
68- const char * chars = env->GetStringUTFChars (str, NULL );
69- std::string results = chars;
70- env->ReleaseStringUTFChars (str, chars);
68+ jclass objClazz = env->GetObjectClass (str);
69+ jmethodID methodId = env->GetMethodID (objClazz, " getBytes" , " (Ljava/lang/String;)[B" );
70+
71+ jstring charsetName = env->NewStringUTF (" UTF-8" );
72+ jbyteArray stringJbytes = (jbyteArray)env->CallObjectMethod (str, methodId, charsetName);
73+ env->DeleteLocalRef (charsetName);
74+
75+ jbyte* pBytes = env->GetByteArrayElements (stringJbytes, NULL );
76+
77+ const jsize length = env->GetArrayLength (stringJbytes);
78+ std::string results ((const char *)pBytes, length);
79+
80+ env->ReleaseByteArrayElements (stringJbytes, pBytes, JNI_ABORT);
81+ env->DeleteLocalRef (stringJbytes);
82+
7183 return results;
7284}
7385
@@ -327,8 +339,8 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
327339 }
328340
329341 if (arg->IsString ()) {
330- v8::String::Utf8Value val (arg->ToString ());
331- return env->NewStringUTF (*val);
342+ v8::String::Value val (arg->ToString ());
343+ return env->NewString (*val, val. length () );
332344 }
333345
334346 if (arg->IsInt32 () || arg->IsUint32 ()) {
@@ -668,7 +680,10 @@ v8::Local<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj, DynamicProxy
668680 return Nan::New<v8::Number>(result);
669681 }
670682 case TYPE_STRING:
671- return Nan::New<v8::String>(javaObjectToString (env, obj).c_str ()).ToLocalChecked ();
683+ {
684+ std::string str = javaObjectToString (env, obj);
685+ return Nan::New<v8::String>(str.c_str (), str.length ()).ToLocalChecked ();
686+ }
672687 case TYPE_OBJECT:
673688 if (dynamicProxyData != NULL ) {
674689 return JavaProxyObject::New (java, obj, dynamicProxyData);
0 commit comments