Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e149c52 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi Committed by Android (Google) Code Review
Browse files

Merge "[res] Optimize TypedValue filling from JNI" into main

parents e3aa00c1 19986198
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -815,6 +815,7 @@ public class TypedValue {
        assetCookie = other.assetCookie;
        resourceId = other.resourceId;
        density = other.density;
        usesFeatureFlags = other.usesFeatureFlags;
    }

    public String toString()
@@ -831,7 +832,28 @@ public class TypedValue {
        if (resourceId != 0) {
            sb.append(" r=0x").append(Integer.toHexString(resourceId));
        }
        if (usesFeatureFlags) {
            sb.append(" flagged");
        }
        sb.append("}");
        return sb.toString();
    }

    /**
     * A JNI interface so it can set all values in a single call, speeding up a
     * very common operation.
     *
     * @hide
     */
    void setFields(int aType, int aAssetCookie, int aData, int aResourceId,
            int aChangingConfigurations, int aDensity, boolean aUsesFeatureFlags) {
        type = aType;
        assetCookie = aAssetCookie;
        data = aData;
        string = null;
        resourceId = aResourceId;
        changingConfigurations = aChangingConfigurations;
        density = aDensity;
        usesFeatureFlags = aUsesFeatureFlags;
    }
}
+7 −29
Original line number Diff line number Diff line
@@ -60,14 +60,7 @@ namespace android {
// ----------------------------------------------------------------------------

static struct typedvalue_offsets_t {
  jfieldID mType;
  jfieldID mData;
  jfieldID mString;
  jfieldID mAssetCookie;
  jfieldID mResourceId;
  jfieldID mChangingConfigurations;
  jfieldID mDensity;
  jfieldID mUsesFeatureFlags;
    jmethodID setFields;
} gTypedValueOffsets;

// This is also used by asset_manager.cpp.
@@ -130,16 +123,10 @@ constexpr inline static ApkAssetsCookie JavaCookieToApkAssetsCookie(jint cookie)

static jint CopyValue(JNIEnv* env, const AssetManager2::SelectedValue& value,
                      jobject out_typed_value) {
  env->SetIntField(out_typed_value, gTypedValueOffsets.mType, value.type);
  env->SetIntField(out_typed_value, gTypedValueOffsets.mAssetCookie,
                   ApkAssetsCookieToJavaCookie(value.cookie));
  env->SetIntField(out_typed_value, gTypedValueOffsets.mData, value.data);
  env->SetObjectField(out_typed_value, gTypedValueOffsets.mString, nullptr);
  env->SetIntField(out_typed_value, gTypedValueOffsets.mResourceId, value.resid);
  env->SetIntField(out_typed_value, gTypedValueOffsets.mChangingConfigurations, value.flags);
  env->SetIntField(out_typed_value, gTypedValueOffsets.mDensity, value.config.density);
  env->SetBooleanField(out_typed_value, gTypedValueOffsets.mUsesFeatureFlags,
                       value.entry_flags & ResTable_entry::FLAG_USES_FEATURE_FLAGS);
    env->CallVoidMethod(out_typed_value, gTypedValueOffsets.setFields, value.type,
                        ApkAssetsCookieToJavaCookie(value.cookie), value.data, value.resid,
                        value.flags, value.config.density,
                        (value.entry_flags & ResTable_entry::FLAG_USES_FEATURE_FLAGS) != 0);
    return static_cast<jint>(ApkAssetsCookieToJavaCookie(value.cookie));
}

@@ -1658,16 +1645,7 @@ int register_android_content_AssetManager(JNIEnv* env) {
  gApkAssetsFields.native_ptr = GetFieldIDOrDie(env, apk_assets_class, "mNativePtr", "J");

  jclass typedValue = FindClassOrDie(env, "android/util/TypedValue");
  gTypedValueOffsets.mType = GetFieldIDOrDie(env, typedValue, "type", "I");
  gTypedValueOffsets.mData = GetFieldIDOrDie(env, typedValue, "data", "I");
  gTypedValueOffsets.mString =
      GetFieldIDOrDie(env, typedValue, "string", "Ljava/lang/CharSequence;");
  gTypedValueOffsets.mAssetCookie = GetFieldIDOrDie(env, typedValue, "assetCookie", "I");
  gTypedValueOffsets.mResourceId = GetFieldIDOrDie(env, typedValue, "resourceId", "I");
  gTypedValueOffsets.mChangingConfigurations =
      GetFieldIDOrDie(env, typedValue, "changingConfigurations", "I");
  gTypedValueOffsets.mDensity = GetFieldIDOrDie(env, typedValue, "density", "I");
  gTypedValueOffsets.mUsesFeatureFlags = GetFieldIDOrDie(env, typedValue, "usesFeatureFlags", "Z");
  gTypedValueOffsets.setFields = GetMethodIDOrDie(env, typedValue, "setFields", "(IIIIIIZ)V");

  jclass assetManager = FindClassOrDie(env, "android/content/res/AssetManager");
  gAssetManagerOffsets.mObject = GetFieldIDOrDie(env, assetManager, "mObject", "J");