Tech Racho エンジニアの「?」を「!」に。
  • 開発

JNIのSignature指定 ドルマークとセミコロンに注意

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なインナークラス(ネストしたクラス)を指定するには、$でつなげます。

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。