Skip to content

Commit 0b26c64

Browse files
committed
Merge pull request #151 from NativeScript/atanasovg/v8-two-byte-string
Marshall Java strings as two-byte V8 strings.
2 parents 6b2379e + cd97e44 commit 0b26c64

File tree

8 files changed

+40
-56
lines changed

8 files changed

+40
-56
lines changed

src/jni/Android.mk

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ include $(PREBUILT_STATIC_LIBRARY)
6161

6262
include $(CLEAR_VARS)
6363
LOCAL_CPPFLAGS += -std=c++11
64-
LOCAL_CPPFLAGS += -fshort-wchar
6564
LOCAL_MODULE := NativeScript
6665
LOCAL_SRC_FILES := com_tns_Platform.cpp com_tns_JsDebugger.cpp com_tns_AssetExtractor.cpp com_tns_NativeScriptActity.cpp \
6766
JEnv.cpp DirectBuffer.cpp \

src/jni/ArgConverter.cpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void ArgConverter::NativeScriptLongFunctionCallback(const v8::FunctionCallbackIn
4545
{
4646
auto isolate = Isolate::GetCurrent();
4747
args.This()->SetHiddenValue(V8StringConstants::GetJavaLong(), Boolean::New(isolate, true));
48-
args.This()->SetHiddenValue(ConvertToV8String(V8StringConstants::MARKED_AS_LONG), args[0]);
48+
args.This()->SetHiddenValue(V8StringConstants::GetMarkedAsLong(), args[0]);
4949
args.This()->Set(V8StringConstants::GetValue(), args[0]);
5050

5151
args.This()->SetPrototype(Local<NumberObject>::New(Isolate::GetCurrent(), *NAN_NUMBER_OBJECT));
@@ -163,16 +163,11 @@ Local<String> ArgConverter::jstringToV8String(jstring value)
163163
return Handle<String>();
164164
}
165165

166-
jsize utfLength;
167-
bool readInBuffer = ReadJStringInBuffer(value, utfLength);
168-
if(readInBuffer) {
169-
return ConvertToV8String(charBuffer, utfLength);
170-
}
171-
172166
JEnv env;
173-
const char* chars = env.GetStringUTFChars(value, NULL);
174-
auto v8String = ConvertToV8String(chars, utfLength);
175-
env.ReleaseStringUTFChars(value, chars);
167+
auto chars = env.GetStringChars(value, NULL);
168+
auto length = env.GetStringLength(value);
169+
auto v8String = ConvertToV8String(chars, length);
170+
env.ReleaseStringChars(value, chars);
176171

177172
return v8String;
178173
}
@@ -197,13 +192,7 @@ bool ArgConverter::ReadJStringInBuffer(jstring value, jsize& utfLength) {
197192

198193
Handle<String> ArgConverter::jcharToV8String(jchar value)
199194
{
200-
JEnv env;
201-
202-
JniLocalRef str(env.NewString(&value, 1));
203-
jboolean bol = true;
204-
const char* resP = env.GetStringUTFChars(str, &bol);
205-
auto v8String = ConvertToV8String(resP, 1);
206-
env.ReleaseStringUTFChars(str, resP);
195+
auto v8String = ConvertToV8String(&value, 1);
207196
return v8String;
208197
}
209198

src/jni/JsArgConverter.cpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -330,24 +330,7 @@ bool JsArgConverter::ConvertJavaScriptBoolean(JEnv& env, const Handle<Value>& js
330330

331331
bool JsArgConverter::ConvertJavaScriptString(JEnv& env, const Handle<Value>& jsValue, int index)
332332
{
333-
Handle<String> argAsString;
334-
if (jsValue->IsStringObject())
335-
{
336-
auto stringObject = Handle<StringObject>::Cast(jsValue);
337-
argAsString = stringObject->ValueOf();
338-
}
339-
else
340-
{
341-
argAsString = jsValue->ToString();
342-
}
343-
344-
String::Utf8Value stringValue(argAsString);
345-
// int strLength = stringValue.length();
346-
//
347-
// JniLocalRef strData(env.NewByteArray(strLength));
348-
// env.SetByteArrayRegion(strData, 0, strLength, (jbyte*)*stringValue);
349-
// JniLocalRef stringObject(env.NewObject(STRING_CLASS, STRING_CTOR, (jbyteArray)strData, UTF_8_ENCODING));
350-
JniLocalRef stringObject(env.NewStringUTF((const char*)*stringValue));
333+
JniLocalRef stringObject(ConvertToJavaString(jsValue));
351334
SetConvertedObject(env, index, stringObject);
352335

353336
return true;

src/jni/JsArgToArrayConverter.cpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -148,24 +148,7 @@ bool JsArgToArrayConverter::ConvertArg(const Handle<Value>& arg, int index)
148148
}
149149
else if (arg->IsString() || arg->IsStringObject())
150150
{
151-
Handle<String> argAsString;
152-
if (arg->IsStringObject())
153-
{
154-
auto stringObject = *reinterpret_cast<v8::Handle<StringObject>*>(const_cast<v8::Handle<Value>*>(&arg));
155-
argAsString = stringObject->ValueOf();
156-
}
157-
else
158-
{
159-
argAsString = arg->ToString();
160-
}
161-
162-
String::Utf8Value stringValue(argAsString);
163-
// int strLength = stringValue.length();
164-
//
165-
// JniLocalRef strData(env.NewByteArray(strLength));
166-
// env.SetByteArrayRegion((jbyteArray)strData, 0, strLength, (jbyte*)*stringValue);
167-
// JniLocalRef stringObject(env.NewObject(STRING_CLASS, STRING_CTOR, (jbyteArray)strData, UTF_8_ENCODING));
168-
JniLocalRef stringObject(env.NewStringUTF((const char*)*stringValue));
151+
JniLocalRef stringObject(ConvertToJavaString(arg));
169152
SetConvertedObject(env, index, stringObject);
170153

171154
success = true;

src/jni/V8GlobalHelpers.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "V8GlobalHelpers.h"
2+
#include "JEnv.h"
23

34
using namespace v8;
45
using namespace std;
@@ -16,6 +17,30 @@ string tns::ConvertToString(const v8::Handle<String>& s)
1617
}
1718
}
1819

20+
jstring tns::ConvertToJavaString(const Handle<Value>& value)
21+
{
22+
Handle<String> valueAsString;
23+
if (value->IsStringObject())
24+
{
25+
auto stringObject = Handle<StringObject>::Cast(value);
26+
valueAsString = stringObject->ValueOf();
27+
}
28+
else
29+
{
30+
valueAsString = value->ToString();
31+
}
32+
33+
JEnv env;
34+
String::Value stringValue(valueAsString);
35+
return env.NewString((const jchar*)*stringValue, valueAsString->Length());
36+
}
37+
38+
Local<String> tns::ConvertToV8String(const jchar* data, int length)
39+
{
40+
auto isolate = Isolate::GetCurrent();
41+
return String::NewFromTwoByte(isolate, (const uint16_t*)data, String::kNormalString, length);
42+
}
43+
1944
Local<String> tns::ConvertToV8String(const string& s)
2045
{
2146
auto isolate = Isolate::GetCurrent();
@@ -39,4 +64,3 @@ bool tns::V8SetHiddenValue(const Handle<Object>& obj, const string& propName, co
3964
auto s = tns::ConvertToV8String(propName);
4065
return obj->SetHiddenValue(s, value);
4166
}
42-

src/jni/V8GlobalHelpers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
#ifndef V8GLOBALHELPERS_H_
22
#define V8GLOBALHELPERS_H_
33

4+
#include "jni.h"
45
#include "v8.h"
56
#include <string>
67

78
namespace tns
89
{
910
std::string ConvertToString(const v8::Handle<v8::String>& s);
1011

12+
jstring ConvertToJavaString(const v8::Handle<v8::Value>& jsValue);
13+
14+
v8::Local<v8::String> ConvertToV8String(const jchar* data, int length);
15+
1116
v8::Local<v8::String> ConvertToV8String(const std::string& s);
1217

1318
v8::Local<v8::String> ConvertToV8String(const char *data, int length);

test-app/assets/app/bootstrap.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ global.__JUnitSaveResults = function (unitTestResults) {
1717
var unitTestFileName = 'android_unit_test_results.xml';
1818
try {
1919
var javaFile = new java.io.File(pathToSdcard, unitTestFileName);
20+
2021
var stream = new java.io.FileOutputStream(javaFile);
2122
var actualEncoding = 'UTF-8';
2223
var writer = new java.io.OutputStreamWriter(stream, actualEncoding);

test-app/try_to_find_test_result_file.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var sys = require('sys'),
55

66
isTimeToExit = false,
77

8-
processTimeout = 700000,
8+
processTimeout = 11 * 60 * 1000, // 11 minutes timeout (empirical constant :))
99
searchInterval = 10000;
1010

1111

0 commit comments

Comments
 (0)