shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager9.java
@Implementation(minSdk = P)
  protected static int nativeGetResourceArray(long ptr, @ArrayRes int resid,
      @NonNull int[] out_data) {
    CppAssetManager2 assetmanager = AssetManagerFromLong(ptr);
    ResolvedBag bag = assetmanager.GetBag(resid);
    if (bag == null) {
      return -1;
    }

    int out_data_length = out_data.length;
    // if (env.ExceptionCheck()) {
    //   return -1;
    // }

    if ((int) (bag.entry_count) > out_data_length * STYLE_NUM_ENTRIES) {
      throw new IllegalArgumentException("Input array is not large enough");
    }

    int[] buffer = out_data; // reinterpret_cast<int*>(env.GetPrimitiveArrayCritical(out_data, null));
    if (buffer == null) {
      return -1;
    }

    int[] cursor = buffer;
    for (int i = 0; i < bag.entry_count; i++) {
      ResolvedBag.Entry entry = bag.entries[i];
      final Ref<Res_value> value = new Ref<>(entry.value);
      final Ref<ResTable_config> selected_config = new Ref<>(new ResTable_config());
      selected_config.get().density = 0;
      final Ref<Integer> flags = new Ref<>(bag.type_spec_flags);
      final Ref<Integer> ref = new Ref<>(0);
      ApkAssetsCookie cookie =
          assetmanager.ResolveReference(entry.cookie, value, selected_config, flags, ref);
      if (cookie.intValue() == kInvalidCookie) {
        // env.ReleasePrimitiveArrayCritical(out_data, buffer, JNI_ABORT);
        return -1;
      }

      // Deal with the special @null value -- it turns back to TYPE_NULL.
      if (value.get().dataType == Res_value.TYPE_REFERENCE && value.get().data == 0) {
        value.set(Res_value.NULL_VALUE);
      }

      int offset = i * STYLE_NUM_ENTRIES;
      cursor[offset + STYLE_TYPE] = (int) (value.get().dataType);
      cursor[offset + STYLE_DATA] = (int) (value.get().data);
      cursor[offset + STYLE_ASSET_COOKIE] = ApkAssetsCookieToJavaCookie(cookie);
      cursor[offset + STYLE_RESOURCE_ID] = (int) (ref.get());
      cursor[offset + STYLE_CHANGING_CONFIGURATIONS] = (int) (flags.get());
      cursor[offset + STYLE_DENSITY] = (int) (selected_config.get().density);
      // cursor += STYLE_NUM_ENTRIES;
    }
    // env.ReleasePrimitiveArrayCritical(out_data, buffer, 0);
    return (int) (bag.entry_count);
  }
@Implementation(minSdk = P)
  protected static int nativeGetResourceArray(long ptr, @ArrayRes int resid,
      @NonNull int[] out_data) {
    CppAssetManager2 assetmanager = AssetManagerFromLong(ptr);
    ResolvedBag bag = assetmanager.GetBag(resid);
    if (bag == null) {
      return -1;
    }

    int out_data_length = out_data.length;
    // if (env.ExceptionCheck()) {
    //   return -1;
    // }

    if ((int) (bag.entry_count) > out_data_length * STYLE_NUM_ENTRIES) {
      throw new IllegalArgumentException("Input array is not large enough");
    }

    int[] buffer = out_data; // reinterpret_cast<int*>(env.GetPrimitiveArrayCritical(out_data, null));
    if (buffer == null) {
      return -1;
    }

    int[] cursor = buffer;
    for (int i = 0; i < bag.entry_count; i++) {
      ResolvedBag.Entry entry = bag.entries[i];
      final Ref<Res_value> value = new Ref<>(entry.value);
      final Ref<ResTable_config> selected_config = new Ref<>(new ResTable_config());
      selected_config.get().density = 0;
      final Ref<Integer> flags = new Ref<>(bag.type_spec_flags);
      final Ref<Integer> ref = new Ref<>(0);
      ApkAssetsCookie cookie =
          assetmanager.ResolveReference(entry.cookie, value, selected_config, flags, ref);
      if (cookie.intValue() == kInvalidCookie) {
        // env.ReleasePrimitiveArrayCritical(out_data, buffer, JNI_ABORT);
        return -1;
      }

      // Deal with the special @null value -- it turns back to TYPE_NULL.
      if (value.get().dataType == Res_value.TYPE_REFERENCE && value.get().data == 0) {
        value.set(Res_value.NULL_VALUE);
      }

      int offset = i * STYLE_NUM_ENTRIES;
      cursor[offset + STYLE_TYPE] = (int) (value.get().dataType);
      cursor[offset + STYLE_DATA] = (int) (value.get().data);
      cursor[offset + STYLE_ASSET_COOKIE] = ApkAssetsCookieToJavaCookie(cookie);
      cursor[offset + STYLE_RESOURCE_ID] = (int) (ref.get());
      cursor[offset + STYLE_CHANGING_CONFIGURATIONS] = (int) (flags.get());
      cursor[offset + STYLE_DENSITY] = (int) (selected_config.get().density);
      // cursor += STYLE_NUM_ENTRIES;
    }
    // env.ReleasePrimitiveArrayCritical(out_data, buffer, 0);
    return (int) (bag.entry_count);
  }
@ Implementation ( minSdk = P ) protected static int nativeGetResourceArray ( long ptr , @ ArrayRes int resid , @ NonNull int [ ] out_data ) { CppAssetManager2 assetmanager = AssetManagerFromLong ( ptr ) ; ResolvedBag bag = assetmanager . GetBag ( resid ) ; if ( bag == null ) { return - 1 ; } int out_data_length = out_data . length ; // if (env.ExceptionCheck()) { //   return -1; // } if ( ( int ) ( bag . entry_count ) > out_data_length * STYLE_NUM_ENTRIES ) { throw new IllegalArgumentException ( "Input array is not large enough" ) ; } int [ ] buffer = out_data ; // reinterpret_cast<int*>(env.GetPrimitiveArrayCritical(out_data, null)); if ( buffer == null ) { return - 1 ; } int [ ] cursor = buffer ; for ( int i = 0 ; i < bag . entry_count ; i ++ ) { ResolvedBag . Entry entry = bag . entries [ i ] ; final Ref < Res_value > value = new Ref <> ( entry . value ) ; final Ref < ResTable_config > selected_config = new Ref <> ( new ResTable_config ( ) ) ; selected_config . get ( ) . density = 0 ; final Ref < Integer > flags = new Ref <> ( bag . type_spec_flags ) ; final Ref < Integer > ref = new Ref <> ( 0 ) ; ApkAssetsCookie cookie = assetmanager . ResolveReference ( entry . cookie , value , selected_config , flags , ref ) ; if ( cookie . intValue ( ) == kInvalidCookie ) { // env.ReleasePrimitiveArrayCritical(out_data, buffer, JNI_ABORT); return - 1 ; } // Deal with the special @null value -- it turns back to TYPE_NULL. if ( value . get ( ) . dataType == Res_value . TYPE_REFERENCE && value . get ( ) . data == 0 ) { value . set ( Res_value . NULL_VALUE ) ; } int offset = i * STYLE_NUM_ENTRIES ; cursor [ offset + STYLE_TYPE ] = ( int ) ( value . get ( ) . dataType ) ; cursor [ offset + STYLE_DATA ] = ( int ) ( value . get ( ) . data ) ; cursor [ offset + STYLE_ASSET_COOKIE ] = ApkAssetsCookieToJavaCookie ( cookie ) ; cursor [ offset + STYLE_RESOURCE_ID ] = ( int ) ( ref . get ( ) ) ; cursor [ offset + STYLE_CHANGING_CONFIGURATIONS ] = ( int ) ( flags . get ( ) ) ; cursor [ offset + STYLE_DENSITY ] = ( int ) ( selected_config . get ( ) . density ) ; // cursor += STYLE_NUM_ENTRIES; } // env.ReleasePrimitiveArrayCritical(out_data, buffer, 0); return ( int ) ( bag . entry_count ) ; }
jintArray out_data) {
jintArray out_data ) {