Web3j

如何將 balanceOf 函式與 Web3j 一起用於 Android 應用程序

  • December 25, 2021

我試圖在使用balanceOfWeb3j 在 Java 中生成我們的智能合約(pakoin)函式包裝器之後使用該函式。儘管嘗試了不同的方法,但我得到了很多錯誤,我不知道如何解決它們。

首先,我嘗試這樣做:

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

result= balance.toString();

但是,應用程序突然關閉,而不是列印餘額,我在控制台上出現以下錯誤:

12-30 10:47:55.215 29089-29105/com.daedasan.sgssi_pakos E/AndroidRuntime: 致命異常: AsyncTask #1

程序: com.daedasan.sgssi_pakos, PID: 29089

java.lang.RuntimeException: 執行 doInBackground 時出錯()

在 android.os.AsyncTask $ 3.done(AsyncTask.java:318) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask $ 串列執行器 $ 1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)

原因:java.lang.NoSuchMethodError: No interface method getTypeName()Ljava/lang/String; 在類 Ljava/lang/reflect/Type 中;或其超類(‘java.lang.reflect.Type’ 的聲明出現在 /system/framework/core-oj.jar 中) 在

org.web3j 的 org.web3j.abi.TypeReference.getClassType(TypeReference.java:54)
.abi.FunctionReturnDecoder.build(FunctionReturnDecoder.java:99) 在 org.web3j.abi.FunctionReturnDecoder.decode(FunctionReturnDecoder.java:42) 在 org.web3j.tx.Contract.executeCall(Contract.java:159)

在 org.web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:165) 在 org.web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:176) 在 org.web3j.tx.Contract.lambda $ executeRemoteCallSingleValueReturn $ 1 $ Contract(Contract.java:232) at org.web3j.tx.Contract $ $ Lambda $ 1.call(Unknown Source)

at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30)

at com.daedasan.sgssi_pakos.MainActivity $ ReadTask.doInBackground(MainActivity.java:199) at com.daedasan.sgssi_pakos.MainActivity $ ReadTask.doInBackground(MainActivity.java:181) 在 android.os.AsyncTask $ 2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask $ 串列執行器 $ 1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)

送出時間:11:49 送出時間:11:49

之後,根據我在網上找到的一個例子,我嘗試了這種方式:

BigInteger balance = pakoin.balanceOf(publicKeyUser).sendAsync().get();

result= balance.toString();

這也不起作用。我得到以下異常: 例外

**問:**你知道如何解決這個問題或其他方法嗎?

先感謝您!

您可能會在以下項目中找到有用的資訊。

https://github.com/web3j/web3j/tree/master/integration-tests/src/test

我認為問題可能是您沒有使用大多數 web3 功能執行本地乙太坊節點(無論如何您都無法在 android 上執行)需要連接到乙太坊節點。通常這是 Geth 或 parity 的本地實例,但您也可以使用infura 之類的服務。然後使用類似的東西web3.setProvider(...)(我沒有使用 Web3j,只有 web3.js,所以你必須閱讀文件以獲取詳細資訊,但如果你搜尋“提供者”,它應該會讓你走上正確的軌道)讓 ethereum/web3 在移動設備上執行可能很棘手

引用自:https://ethereum.stackexchange.com/questions/34722