ECode Int32PropertyValuesHolder::SetupSetter( /* [in] */ IInterface* target) { if (mProperty != NULL) { return NOERROR; } // Check new static hashmap<propName, int> for setter method { AutoLock lock(mPropertyMapLock); AutoPtr<IClassInfo> clInfo = TransformClassInfo(target); ClassMethodMapIterator exit = sJNISetterPropertyMap.Find(clInfo); AutoPtr<MethodMap> propertyMap = NULL; if(exit != sJNISetterPropertyMap.End()) { propertyMap = exit->mSecond; if(propertyMap != NULL) { MethodMapIterator it = propertyMap->Find(mPropertyName); if(it != propertyMap->End()) { AutoPtr<IMethodInfo> mtInfo = it->mSecond; if(mtInfo != NULL) { mJniSetter = mtInfo; } } } } if(mJniSetter == NULL) { String methodName = GetMethodName(String("Set"), mPropertyName); clInfo->GetMethodInfo(methodName, (IMethodInfo**)&mJniSetter); if(mJniSetter != NULL) { if (propertyMap == NULL) { propertyMap = new MethodMap(); sJNISetterPropertyMap[clInfo] = propertyMap; } (*propertyMap)[mPropertyName] = mJniSetter; } } } if (mJniSetter == NULL) { // Couldn't find method through fast JNI approach - just use reflection return PropertyValuesHolder::SetupSetter(target); } return NOERROR; }
ECode MultiFloatValuesHolder::SetupSetter( /* [in] */ IInterface* targetClass) { if (mJniSetter != NULL) { return NOERROR; } // try { AutoLock lock(mPropertyMapLock); // mPropertyMapLock.writeLock().lock(); AutoPtr<IClassInfo> info = TransformClassInfo(targetClass); AutoPtr<MethodMap> propertyMap = sJNISetterPropertyMap[info]; typename ClassMethodMap::Iterator it = sJNISetterPropertyMap.Find(info); if ((it != sJNISetterPropertyMap.End()) && (it->mSecond != NULL)) { propertyMap = it->mSecond; typename MethodMap::Iterator it2 = propertyMap->Find(mPropertyName); if ((it2 != propertyMap->End()) && (it2->mSecond != NULL)) { mJniSetter = it2->mSecond; } } if (mJniSetter == NULL) { String methodName = GetMethodName(String("Set"), mPropertyName); CalculateValue(0.f); AutoPtr<IArrayList> values; GetAnimatedValue((IInterface**)&values); Int32 numParams = 0; values->GetSize(&numParams); try { mJniSetter = nGetMultipleFloatMethod(info, methodName, numParams); } catch (NoSuchMethodError e) { // try without the 'set' prefix mJniSetter = nGetMultipleFloatMethod(info, mPropertyName, numParams); } if (mJniSetter != NULL) { if (propertyMap == NULL) { propertyMap = new MethodMap(); sJNISetterPropertyMap[info] = propertyMap; } (*propertyMap)[mPropertyName] = mJniSetter; } } // } finally { // mPropertyMapLock.writeLock().unlock(); // } return NOERROR; }