javaandroid-studioreact-nativenative-module

How do I return an array from a Java module in a React Native Component?


I'm writing this to answer my own question because the docs don't explicitly state this and I couldn't find it on stack overflow or anywhere else. Here is how to return a String array from a Java module back into a React Native Component (simplified from the code in my personal project).

CPPConnection.java file

public class CPPConnection extends ReactContextBaseJavaModule {
@ReactMethod
    public void GetDerivedUnits(String scheme,final Promise promise){
        try {

            List<String> returnSet = new ArrayList<String>();
            //Set first value so that there is a lead value
            returnSet.add("");
            returnSet.add(scheme);
            returnSet.add("lb");
            returnSet.add("kg");
            String[] returnArray = new String[returnSet.size()];
            returnArray = returnSet.toArray(returnArray);

            WritableArray promiseArray=Arguments.createArray();
            for(int i=0;i<returnArray.length;i++){
                promiseArray.pushString(returnArray[i]);
            }

            promise.resolve(promiseArray);
        }
        catch(Exception e){
            promise.reject(e);
        }
    }
}

Density.js file

export default class Density extends Component{
...
constructor(props) {
    super(props);
    this.state = {
      mass: '',
      massUnits:[],
      volume: '',
      volumeUnits:[],
      density: 'N/A',
    };
    this.GetDerivedUnits("M",this.state.massUnits);
    this.GetDerivedUnits("L3",this.state.volumeUnits);
}

GetDerivedUnits= async (scheme,unitArray)=>{
    try{

        let asyncUnitSet = await CPPConnection.GetDerivedUnits(scheme);


        for (let i=0;i<asyncUnitSet.length;i++){
            unitArray.push(asyncUnitSet[i])
            this.setState({
                        unitArray: unitArray
                    })

        }

        console.log(asyncUnitSet);
    }catch(e){
        console.error(e);
    }
}
...
}

Solution

  • I'm writing this to answer my own question because the docs don't explicitly state this and I couldn't find it on stack overflow or anywhere else. Here is how to return a String array from a Java module back into a React Native Component (simplified from the code in my personal project).

    CPPConnection.java file

    public class CPPConnection extends ReactContextBaseJavaModule {
    @ReactMethod
        public void GetDerivedUnits(String scheme,final Promise promise){
            try {
    
                List<String> returnSet = new ArrayList<String>();
                //Set first value so that there is a lead value
                returnSet.add("");
                returnSet.add(scheme);
                returnSet.add("lb");
                returnSet.add("kg");
                String[] returnArray = new String[returnSet.size()];
                returnArray = returnSet.toArray(returnArray);
    
                WritableArray promiseArray=Arguments.createArray();
                for(int i=0;i<returnArray.length;i++){
                    promiseArray.pushString(returnArray[i]);
                }
    
                promise.resolve(promiseArray);
            }
            catch(Exception e){
                promise.reject(e);
            }
        }
    }
    

    Density.js file

    export default class Density extends Component{
    ...
    constructor(props) {
        super(props);
        this.state = {
          mass: '',
          massUnits:[],
          volume: '',
          volumeUnits:[],
          density: 'N/A',
        };
        this.GetDerivedUnits("M",this.state.massUnits);
        this.GetDerivedUnits("L3",this.state.volumeUnits);
    }
    
    GetDerivedUnits= async (scheme,unitArray)=>{
        try{
    
            let asyncUnitSet = await CPPConnection.GetDerivedUnits(scheme);
    
    
            for (let i=0;i<asyncUnitSet.length;i++){
                unitArray.push(asyncUnitSet[i])
                this.setState({
                            unitArray: unitArray
                        })
    
            }
    
            console.log(asyncUnitSet);
        }catch(e){
            console.error(e);
        }
    }
    ...
    }