Caver-java 를 통해 안드로이드환경에서 Contract method 호출시 app이 crash됩니다

klaytn docs에서 제공하고있는 예제대로 실행했을때,
"List result = contract.getMethod(“메소드이름”).call(매개변수, CallObject.createCallObject());
이렇게 컨트랙트 함수를 호출했을경우 app이 오류처리를 무시하고 crash됩니다.

컨트랙트 배포 및 abi,address를 통한 연결은 잘 되있는것으로 확인했고,
method 이름이나 컨트랙트 내의 오류도 아닙니다.
혹시, API의 용법상 문제가 없다면,
caver-java의 안드로이드 환경에서 컨트랙트 메소드 호출 자체에
문제가 있는것은 아닌지 문의 드립니다.

다음은 참조한 예제코드입니다.
실행 환경은 Android 10.0+ /api30 level 이며
caver-java 버전은 1.5.3-rc.1-android 입니다.

private static final String ABIJson = "[{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]\n";


public void callContractFunction() {
    Caver caver = new Caver(Caver.DEFAULT_URL);

    try {
        Contract contract = new Contract(caver, ABIJson, '0x{address in hex}');
        List<Type> result = contract.getMethod("get").call(null, CallObject.createCallObject());
        System.out.println((String)result.get(0).getValue());
    } catch (IOException | TransactionException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
        //handle exception..
    }
}

안녕하세요. 먼저 클레이튼 포럼에 질문을 남겨주셔서 감사합니다. :slight_smile:

문의주신 부분을 살펴보았는데

ABI에 정의되어있는 get이라는 함수는 key라는 이름의 string type을 파라미터로 전달받아야합니다.

앱에서 크러쉬가 난 이유는 get이라는 method에서 요구하는 파라미터를 넣어주지 않았기 때문에, 파라미터가 잘 전달되었는지 체크하는 부분에서 RuntimeException중 하나인 IlleageArgumentException을 발생시킵니다.

이 RuntimeException은 throws로 선언하지않아도 되는 Exception이라 catch로 잡히지 않은 것 같습니다.

크러쉬가 난 시점에 안드로이드 로그를 확인해보시면
java.lang.IllegalArgumentException: Cannot find method with passed parameters. 라는 로그가 찍혀있는것을 확인하실 수 있을거라고 생각합니다.

get으로 정상동작하는 것을 확인하고 싶으시다면, contract의 set()함수를 호출하여 key, value를 등록하시고
아래 코드와 같이 get을 실행시켜주시면 됩니다.

List result = contract.getMethod(“get”).call(Arrays.asList(“key”), CallObject.createCallObject());

아래 링크의 Getting Started의 예제를 참고하시면 많은 도움이 될거라고 생각합니다.
https://docs.klaytn.com/bapp/sdk/caver-java/getting-started#smart-contract

해보시고 안되시는 부분있으면 편안하게 다시 문의 부탁드리겠습니다. :slight_smile:

1 Like