JNI(Android)を書いていて、どうでもいいような箇所でネイティブ層がクラッシュします。
なぜかと思ったら、
jclass myclass= (*env)->FindClass(env, "jp/bpsinc/android/hoge/piyo/Hoge$Piyo");
//NG
jfieldID fidType = (*env)->GetFieldID(env, myclass, "type", "Ljava/lang/String");
//OK
jfieldID fidType = (*env)->GetFieldID(env, myclass, "type", "Ljava/lang/String;");
セミコロンが抜けていました。
すぐ上でFindClassを書いて、そっちはセミコロンいらないので、やっぱり慣れないと凡ミスしますね...
メモ
- GetFieldIDなどのsignatureを指定するところで、クラス名に対してセミコロンを付け忘れると、クラッシュします
- FindClassなどのクラス名を指定するところで、セミコロンを付けてしまうと、NoClassDefFoundErrorが発生します
- staticなインナークラス(ネストしたクラス)を指定するには、$でつなげます。