Skip to content

Commit a65c201

Browse files
committed
Merge pull request #220 from NativeScript/plamen5kov/fix_get_set_null_field
Plamen5kov/fix get set null field
2 parents ae341bc + 3eb7aac commit a65c201

File tree

5 files changed

+50
-55
lines changed

5 files changed

+50
-55
lines changed

src/jni/ArgConverter.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,13 @@ Local<Array> ArgConverter::ConvertJavaArgsToJsArgs(jobjectArray args)
7777
Type argTypeID = (Type)JType::IntValue(env, argTypeIDObj);
7878

7979
Local<Value> jsArg;
80-
Local<String> v8String;
8180
switch (argTypeID)
8281
{
8382
case Type::Boolean:
8483
jsArg = Boolean::New(isolate, JType::BooleanValue(env, arg));
8584
break;
8685
case Type::Char:
87-
v8String = jcharToV8String(JType::CharValue(env, arg));
88-
jsArg = v8String;
86+
jsArg =jcharToV8String(JType::CharValue(env, arg));
8987
break;
9088
case Type::Byte:
9189
jsArg = Number::New(isolate, JType::ByteValue(env, arg));
@@ -106,8 +104,7 @@ Local<Array> ArgConverter::ConvertJavaArgsToJsArgs(jobjectArray args)
106104
jsArg = Number::New(isolate, JType::DoubleValue(env, arg));
107105
break;
108106
case Type::String:
109-
v8String = jstringToV8String((jstring)arg);
110-
jsArg = v8String;
107+
jsArg = jstringToV8String((jstring)arg);
111108
break;
112109
case Type::JsObject:
113110
{
@@ -156,11 +153,11 @@ std::string ArgConverter::jstringToString(jstring value)
156153
return s;
157154
}
158155

159-
Local<String> ArgConverter::jstringToV8String(jstring value)
156+
Local<Value> ArgConverter::jstringToV8String(jstring value)
160157
{
161158
if (value == nullptr)
162159
{
163-
return Local<String>();
160+
return Null(Isolate::GetCurrent());
164161
}
165162

166163
JEnv env;

src/jni/ArgConverter.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace tns
2727

2828
static bool TryConvertToJavaLong(const v8::Local<v8::Value>& value, jlong& javaLong);
2929

30-
static v8::Local<v8::String> jstringToV8String(jstring value);
30+
static v8::Local<v8::Value> jstringToV8String(jstring value);
3131

3232
static std::string jstringToString(jstring value);
3333

src/jni/FieldAccessor.cpp

+34-46
Original file line numberDiff line numberDiff line change
@@ -194,36 +194,26 @@ Local<Value> FieldAccessor::GetJavaField(const Local<Object>& target, FieldCallb
194194
}
195195
else
196196
{
197-
bool isString = fieldTypeName == "java/lang/String";
197+
jobject result;
198198

199-
if (isString)
199+
if (isStatic)
200200
{
201-
JniLocalRef result;
202-
if (isStatic)
203-
{
204-
result = env.GetStaticObjectField(clazz, fieldId);
205-
}
206-
else
207-
{
208-
result = env.GetObjectField(targetJavaObject, fieldId);
209-
}
210-
211-
auto resultV8String = ArgConverter::jstringToV8String(result);
212-
fieldResult = handleScope.Escape(resultV8String);
201+
result = env.GetStaticObjectField(clazz, fieldId);
213202
}
214203
else
215204
{
216-
jobject result;
217-
if (isStatic)
205+
result = env.GetObjectField(targetJavaObject, fieldId);
206+
}
207+
208+
if(result != nullptr) {
209+
210+
bool isString = fieldTypeName == "java/lang/String";
211+
if (isString)
218212
{
219-
result = env.GetStaticObjectField(clazz, fieldId);
213+
auto resultV8Value = ArgConverter::jstringToV8String((jstring)result);
214+
fieldResult = handleScope.Escape(resultV8Value);
220215
}
221216
else
222-
{
223-
result = env.GetObjectField(targetJavaObject, fieldId);
224-
}
225-
226-
if (result != nullptr)
227217
{
228218
int javaObjectID = objectManager->GetOrCreateObjectId(result);
229219
auto objectResult = objectManager->GetJsObjectByJavaObject(javaObjectID);
@@ -233,14 +223,13 @@ Local<Value> FieldAccessor::GetJavaField(const Local<Object>& target, FieldCallb
233223
objectResult = objectManager->CreateJSWrapper(javaObjectID, fieldTypeName, result);
234224
}
235225

236-
env.DeleteLocalRef(result);
237-
238226
fieldResult = handleScope.Escape(objectResult);
239227
}
240-
else
241-
{
242-
fieldResult = Null(isolate);
243-
}
228+
env.DeleteLocalRef(result);
229+
}
230+
else
231+
{
232+
fieldResult = handleScope.Escape(Null(isolate));
244233
}
245234
}
246235
return fieldResult;
@@ -417,34 +406,33 @@ void FieldAccessor::SetJavaField(const Local<Object>& target, const Local<Value>
417406
else
418407
{
419408
bool isString = fieldTypeName == "java/lang/String";
420-
if (isString)
421-
{
422-
//TODO: validate valie is a string;
423-
String::Utf8Value stringValue(value->ToString());
424-
JniLocalRef value(env.NewStringUTF(*stringValue));
409+
jobject result = nullptr;
425410

426-
if (isStatic)
411+
if(!value->IsNull()) {
412+
if (isString)
427413
{
428-
env.SetStaticObjectField(clazz, fieldId, value);
414+
//TODO: validate valie is a string;
415+
result = ConvertToJavaString(value);
429416
}
430417
else
431418
{
432-
env.SetObjectField(targetJavaObject, fieldId, value);
419+
auto objectWithHiddenID = value->ToObject();
420+
result =objectManager->GetJavaObjectByJsObject(objectWithHiddenID);
433421
}
434422
}
423+
424+
if (isStatic)
425+
{
426+
env.SetStaticObjectField(clazz, fieldId, result);
427+
}
435428
else
436429
{
437-
auto objectWithHiddenID = value->ToObject();
438-
jweak javaObject = objectManager->GetJavaObjectByJsObject(objectWithHiddenID);
430+
env.SetObjectField(targetJavaObject, fieldId, result);
431+
}
439432

440-
if (isStatic)
441-
{
442-
env.SetStaticObjectField(clazz, fieldId, javaObject);
443-
}
444-
else
445-
{
446-
env.SetObjectField(targetJavaObject, fieldId, javaObject);
447-
}
433+
if (isString)
434+
{
435+
env.DeleteLocalRef(result);
448436
}
449437
}
450438
}

test-app/assets/app/mainpage.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ require("./tests/testsForTypescript");
1515
require("./tests/testGC");
1616
require("./tests/testsMemoryManagement");
1717
require("./tests/testIfAbleToRunExternalFile");
18-
require("./tests/finalFieldsSetTests");
18+
require("./tests/testFieldGetSet");
1919
require("./tests/extendedClassesTests");
2020
require("./tests/extendClassNameTests");
2121
require("./tests/testJniReferenceLeak");

test-app/assets/app/tests/finalFieldsSetTests.js test-app/assets/app/tests/testFieldGetSet.js

+10
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,14 @@ describe("Tests final fields set", function () {
1414

1515
expect(exceptionCaught).toBe(true);
1616
});
17+
18+
it("When setting a field with null it should return null object", function () {
19+
20+
var dc = new com.tns.tests.DummyClass();
21+
22+
dc.nameField = null;
23+
var s = dc.nameField;
24+
25+
expect(s).toBe(null);
26+
});
1727
});

0 commit comments

Comments
 (0)