Error al llamar a una función de un contrato inteligente con web3j

Estoy tratando de usar una función que devuelve un valor del contrato inteligente (pakoin).

contract Pacoin {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
    mapping (address => uint256) public vales;
    string public name;
    string public symbol;
    uint8 public decimals;
    address public pakos;

    //Here some functions

    function nPakoins() public constant returns (uint256 npakoins) {
        npakoins = balanceOf[msg.sender];
    }

    function nVales() public constant returns (uint256 nvales) {
        nvales = vales[msg.sender];
    }

}

A pesar de intentarlo de diferentes formas, me dan muchos errores y no sé cómo solucionarlos.

BigInteger balance = pakoin.nPakoins(publicKeyUser).send();

Sin embargo, en lugar de devolver el valor, la aplicación se cierra repentinamente y tengo el siguiente error en la consola:

en clase Ljava/lang/reflect/Type; o sus superclases (la declaración de 'java.lang.reflect.Type' aparece en /system/framework/core-oj.jar) en org.web3j.abi.TypeReference.getClassType(TypeReference.java:54) en org.web3j .abi.FunctionReturnDecoder.build(FunctionReturnDecoder.java:99) en org.web3j.abi.FunctionReturnDecoder.decode(FunctionReturnDecoder.java:42) en org.web3j.tx.Contract.executeCall(Contract.java:159) en org. web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:165) en org.web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:176) en org.web3j.tx.Contract.lambda$executeRemoteCallSingleValueReturn$1$Contract(Contract.java :232) en org.web3j.tx.Contract$$Lambda$1.call(Fuente desconocida) en org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30) en com.daedasan.sgssi_pakos.MainActivity$ReadTask .

P: ¿ Sabe cómo resolver este problema u otra forma de hacerlo? ¡Gracias de antemano!

Aquí está toda la clase.

public class MainActivity extends AppCompatActivity {

    private final static String publicKeyUser = "0x4B5867c957a0950d4086172cA215Ac432b28b868";
    private final static String privateKeyRinkeby = "***MyPrivateKey***";
    private final static String greeterContractAddressRinkeby = "0x7a698A3072C01c4a9339ea929Cd2a241bED81937";
    private final static String rinkebyUrl = "https://rinkeby.infura.io/hbvHwdGroO3GR4JQJvEl";
    //private static final Logger log = LoggerFactory.getLogger(MainActivity.class);
    private ProgressBar progressBar;
    private ProgressBar progressBar2;
    private EditText editText;
    private TextView comprarTextView;
    private TextView gasPriceTextView;
    private TextView gasLimitTextView;
    private SeekBar gasPriceSeekBar;
    private Button botonNumPakoins;
    private EditText nVales;

    private Web3j web3j;

    private Credentials credentials = Credentials.create(privateKeyRinkeby);
    private int minimumGasLimit = 50000;
    private BigInteger gasLimit = new BigInteger(String.valueOf(minimumGasLimit));

    public MainActivity() throws IOException, CipherException {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUi();
        setGasPriceText(10);
        setGasLimit(minimumGasLimit);
        initWeb3j();
    }

    private void initUi() {
        progressBar = (ProgressBar) findViewById(R.id.progressbar);
        progressBar2 = (ProgressBar) findViewById(R.id.progressBar2);
        comprarTextView = (TextView) findViewById(R.id.ComprarText);
        botonNumPakoins = (Button) findViewById(R.id.botonNPakoins);
        nVales = (EditText) findViewById(R.id.NValesCanjear);
        botonNumPakoins.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getNumPakoins();
            }
        });
        gasPriceSeekBar = (SeekBar) findViewById(R.id.gas_price_seek_bar);
        gasPriceSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                setGasPriceText(progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
        SeekBar gasLimitSeekBar = (SeekBar) findViewById(R.id.gas_limit_seek_bar);
        gasLimitSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                setGasLimit(progress + minimumGasLimit);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
        gasLimitTextView = (TextView) findViewById(R.id.gas_limit_text_view);
        gasPriceTextView = (TextView) findViewById(R.id.gas_price_text_view);
    }


    private void writeGreetingToContract() {
        progressBar.setVisibility(View.VISIBLE);
        WriteTask writeTask = new WriteTask();
        writeTask.execute(editText.getText().toString());
    }

    private void  getNumPakoins(){
        try {
            progressBar.setVisibility(View.VISIBLE);
            numPakoins numeroPakoins = new numPakoins();
            numeroPakoins.execute();
        } catch (Exception e) {
            Log.d("wat", "getDiezBonosexception = " + e.getMessage());
        }
    }

    private void initWeb3j() {
        InitWeb3JTask task = new InitWeb3JTask();
        task.execute(rinkebyUrl);
    }

    public void setGasPriceText(int gasPrice) {
        String formattedString = getString(R.string.gas_price, String.valueOf(gasPrice));
        gasPriceTextView.setText(formattedString);
    }

    private BigInteger getGasPrice() {
        int gasPriceGwei = gasPriceSeekBar.getProgress();
        BigInteger gasPriceWei = BigInteger.valueOf(gasPriceGwei + 1000000000L);
        Log.d("wat", "getGasPrice: " + String.valueOf(gasPriceGwei));
        return gasPriceWei;
    }

    public void setGasLimit(int gasLimit) {
        String gl = String.valueOf(gasLimit);
        this.gasLimit = new BigInteger(gl);
        gasLimitTextView.setText(getString(R.string.gas_limit, gl));
    }

    private class numPakoins extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String result;
            try {
                Pakoin pakoin = Pakoin.load(greeterContractAddressRinkeby, web3j, credentials, getGasPrice(), gasLimit);
                BigInteger balance = pakoin.nPakoins(publicKeyUser).send();
                result = balance.toString();
                //result = transactionReceipt.getBlockHash();
            } catch (Exception e) {
                result = "Error reading the smart contract. Error: " + e.getMessage();
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            progressBar.setVisibility(View.INVISIBLE);
            comprarTextView.setText(result);
        }
    }


    private class InitWeb3JTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String url = params[0];
            HttpService infuraHttpService;
            String result = "Success initializing web3j/infura";
            try {
                infuraHttpService = new HttpService(url);
                web3j = Web3j.build(new HttpService(url));
            } catch (Exception wtf) {
                String exception = wtf.toString();
                Log.d("wat", "Error initializing web3j/infura. Error: " + exception);
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
        }
    }

Respuestas (1)

El problema puede ser causado por AsyncTask. Intente llamar a su contrato desde el hilo principal para ver qué sucede. La posible solución es usar java.lang.Thread.

Gracias por responder. Lo he estado buscando en internet pero no lo encuentro. ¿Podría decirme cómo llamar a mi contrato desde el hilo principal?
¿Puede publicar toda la clase o actividad donde se llama esta función?
Por supuesto. Acabo de editar la descripción y agregar toda la clase.
Función editada initWeb3j: pastebin.com/eGJXSW1D
Gracias por su ayuda, pero después de agregar la función editada initiWeb3j sigo teniendo el mismo error: java.lang.NoSuchMethodError: No hay método de interfaz getTypeName()Ljava/lang/String; en clase Ljava/lang/reflect/Type; o sus superclases (la declaración de 'java.lang.reflect.Type' aparece en /system/framework/core-oj.jar)