Date: 2017/11/14 Cate: Android, cocos2d-x Tags:

cocos2d-xでゲームを開発していて、AndroidでAWSのSDKを使いDynamoDBへアクセスする、ということがありました。
C++からJNI経由でjavaのコードを呼び出し、javaからAWSのSDKを使うといったかんじです。

JNIの呼び出しでエラーがでる

JNI経由でjavaのコードを呼び出すとき、

Classloader failed to find class of AwsUtil
Failed to find class AwsUtil

といったようなエラーが発生しました。
要するにC++からJNI経由でjavaのメソッドを呼び出そうとしたけど、そんなクラス無いよってエラーです。
しかし何度確認してもクラスはあるし、タイポとかもしていない・・・。
もしかしてDynamoDBへアクセスする方法に問題があるのか?と思い、DynamoDBへアクセスする部分のコードをコメントアウトしてみると、ちゃんとjava側のメソッドが呼ばれました。

DynamoDBへアクセスするときのExceptionをちゃんとみる

DynamoDBへのアクセスで問題が起きているっぽいので、try~catchで例外がないかちゃんと確認したところ、やっぱり例外を吐いていました。
「dynamodb no method annotated with interface …」といった例外を吐いていて、要するにDynamoDBのテーブル構造を表すためのclassがちゃんと無いよ!ってエラーです。

proguardが原因だった

ちゃんとクラス作ってるのにな?と思って調べてみると、原因はproguardでした・・・。
proguardでクラスの名前が変わったりしていることでクラスを認識できず、エラーになっていたようです。
最初にみたエラーがJNIでのfailed to find classのエラーだったので、JNIのコードが間違っていないかとかばっかり確認していて、proguardに気づかずかなりハマってしまいました・・・。

Leave a Reply