| 186 | } |
| 187 | |
| 188 | void FieldAccessor::SetJavaField(Isolate* isolate, const Local<Object>& target, const Local<Value>& value, FieldCallbackData* fieldData) { |
| 189 | JEnv env; |
| 190 | |
| 191 | auto &fieldMetadata = fieldData->metadata; |
| 192 | |
| 193 | HandleScope handleScope(isolate); |
| 194 | auto runtime = Runtime::GetRuntime(isolate); |
| 195 | auto objectManager = runtime->GetObjectManager(); |
| 196 | |
| 197 | JniLocalRef targetJavaObject; |
| 198 | |
| 199 | const auto& fieldTypeName = fieldMetadata.getSig(); |
| 200 | auto isStatic = fieldMetadata.isStatic; |
| 201 | |
| 202 | |
| 203 | auto isPrimitiveType = fieldTypeName.size() == 1; |
| 204 | auto isFieldArray = fieldTypeName[0] == '['; |
| 205 | |
| 206 | if (fieldData->fid == nullptr) { |
| 207 | auto fieldJniSig = isPrimitiveType |
| 208 | ? fieldTypeName |
| 209 | : |
| 210 | (isFieldArray |
| 211 | ? fieldTypeName |
| 212 | : |
| 213 | ("L" + fieldTypeName + ";")); |
| 214 | |
| 215 | if (isStatic) { |
| 216 | fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType()); |
| 217 | assert(fieldData->clazz != nullptr); |
| 218 | fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig); |
| 219 | assert(fieldData->fid != nullptr); |
| 220 | } else { |
| 221 | fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType()); |
| 222 | assert(fieldData->clazz != nullptr); |
| 223 | fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig); |
| 224 | assert(fieldData->fid != nullptr); |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | if (!isStatic) { |
| 229 | targetJavaObject = objectManager->GetJavaObjectByJsObject(target); |
| 230 | |
| 231 | if (targetJavaObject.IsNull()) { |
| 232 | stringstream ss; |
| 233 | ss << "Cannot access property '" << fieldMetadata.name.c_str() << "' because there is no corresponding Java object"; |
| 234 | throw NativeScriptException(ss.str()); |
| 235 | } |
| 236 | } |
| 237 | |
| 238 | auto fieldId = fieldData->fid; |
| 239 | auto clazz = fieldData->clazz; |
| 240 | |
| 241 | if (isPrimitiveType) { |
| 242 | auto context = isolate->GetCurrentContext(); |
| 243 | switch (fieldTypeName[0]) { |
| 244 | case 'Z': { //bool |
| 245 | //TODO: validate value is a boolean before calling |
nothing calls this directly
no test coverage detected