| 9 | using namespace tns; |
| 10 | |
| 11 | Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>& target, FieldCallbackData* fieldData) { |
| 12 | JEnv env; |
| 13 | |
| 14 | EscapableHandleScope handleScope(isolate); |
| 15 | auto runtime = Runtime::GetRuntime(isolate); |
| 16 | auto objectManager = runtime->GetObjectManager(); |
| 17 | |
| 18 | Local<Value> fieldResult; |
| 19 | |
| 20 | JniLocalRef targetJavaObject; |
| 21 | |
| 22 | auto &fieldMetadata = fieldData->metadata; |
| 23 | |
| 24 | const auto& fieldTypeName = fieldMetadata.getSig(); |
| 25 | auto isStatic = fieldMetadata.isStatic; |
| 26 | |
| 27 | auto isPrimitiveType = fieldTypeName.size() == 1; |
| 28 | auto isFieldArray = fieldTypeName[0] == '['; |
| 29 | |
| 30 | if (fieldData->fid == nullptr) { |
| 31 | auto fieldJniSig = isPrimitiveType |
| 32 | ? fieldTypeName |
| 33 | : |
| 34 | (isFieldArray |
| 35 | ? fieldTypeName |
| 36 | : |
| 37 | ("L" + fieldTypeName + ";")); |
| 38 | |
| 39 | if (isStatic) { |
| 40 | fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType()); |
| 41 | fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig); |
| 42 | } else { |
| 43 | fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType()); |
| 44 | fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig); |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | if (!isStatic) { |
| 49 | targetJavaObject = objectManager->GetJavaObjectByJsObject(target); |
| 50 | |
| 51 | if (targetJavaObject.IsNull()) { |
| 52 | stringstream ss; |
| 53 | ss << "Cannot access property '" << fieldMetadata.name.c_str() << "' because there is no corresponding Java object"; |
| 54 | throw NativeScriptException(ss.str()); |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | auto fieldId = fieldData->fid; |
| 59 | auto clazz = fieldData->clazz; |
| 60 | |
| 61 | if (isPrimitiveType) { |
| 62 | switch (fieldTypeName[0]) { |
| 63 | case 'Z': { //bool |
| 64 | jboolean result; |
| 65 | if (isStatic) { |
| 66 | result = env.GetStaticBooleanField(clazz, fieldId); |
| 67 | } else { |
| 68 | result = env.GetBooleanField(targetJavaObject, fieldId); |
nothing calls this directly
no test coverage detected