React Native передать массив в нативный модуль Java и обработать его там, как?

Чтобы передать массив из React Native в нативный модуль Java и обработать его там, вам потребуется создать мост между JavaScript и Java с помощью React Native Bridge.

1. Сначала вам нужно создать модуль Java, который будет обрабатывать переданный массив. Создайте новый класс в папке android/app/src/main/java/your/package/name с именем CustomModule.java:

package your.package.name;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;

public class CustomModule extends ReactContextBaseJavaModule {
  public CustomModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "CustomModule";
  }

  @ReactMethod
  public void processArray(ReadableArray array) {
    // Ваш код для обработки массива здесь
    // Пример кода ниже создает новый массив и отправляет его обратно в JavaScript
    WritableArray newArray = Arguments.createArray();
    for (int i = 0; i < array.size(); i++) {
      WritableMap map = array.getMap(i);
      // Ваша обработка здесь
      newArray.pushMap(map);
    }
    // Отправляем обратно в JavaScript
    getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit("processedArray", newArray);
  }
}

2. Далее вам нужно зарегистрировать ваш модуль Java в MainApplication.java. Он находится в android/app/src/main/java/your/package/name:

package your.package.name;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {
  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
          // Добавьте ваш пакет сюда
          new CustomPackage()
      );
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
      return mReactNativeHost;
  }

  @Override
  public void onCreate() {
      super.onCreate();
      SoLoader.init(this, /* native exopackage */ false);
  }
}

3. Далее вам нужно создать пакет для вашего модуля Java, чтобы его можно было зарегистрировать в MainApplication.java. Создайте класс CustomPackage.java в той же папке Java, что и CustomModule.java:

package your.package.name;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CustomPackage implements ReactPackage {
  @Override
  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
  }

  @Override
  public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();

    // Добавляем ваш модуль в пакет
    modules.add(new CustomModule(reactContext));

    return modules;
  }
}

4. Теперь вы можете использовать ваш модуль Java в коде React Native. В JavaScript необходимо импортировать NativeModules и вызвать метод processArray:

import { NativeModules } from 'react-native';

const CustomModule = NativeModules.CustomModule;

const arrayToProcess = [
  { name: 'John', age: 25 },
  { name: 'Jane', age: 30 },
];

CustomModule.processArray(arrayToProcess);

5. Можно даже подписаться на событие processedArray в JavaScript, чтобы получить обработанный массив из Java:

import { NativeEventEmitter, NativeModules } from 'react-native';

const CustomModule = NativeModules.CustomModule;
const eventEmitter = new NativeEventEmitter(CustomModule);

const subscription = eventEmitter.addListener(
  'processedArray',
  (processedArray) => console.log(processedArray)
);

// Отменить подписку, когда она больше не нужна
subscription.remove();

Теперь, когда вы вызываете processArray() в JavaScript, массив будет передан в модуль Java, обработанный и отправлен обратно в JavaScript через событие 'processedArray'.