JniHelper::getStaticMethoInfo


いつも間違えるので、備忘録。

void InterfaceJNI::funcSendfloat(const char* value1, float value2){

  JniMethodInfo t;
  if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(Ljava/lang/String;F)V")){

    jstring stringArg1 = t.env->NewStringUTF(value1);

    t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1, value2);
    t.env->DeleteLocalRef(stringArg1);
    t.env->DeleteLocalRef(t.classID);
  }
}



ま、こんな感じで指定しているのですが、文字列じゃない引数が複数あるとき、つい「;」をトークン的につけちゃう。
例えば Int 型3つだと、こんな感じ。

×   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(I;I;I;)V")){
○   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(III)V")){

文字列型の指定の Ljava/lang/String; の最後の「;」をトークンだと思っちゃうんだけど、大きな間違い。

「;」を含めて文字列の引数を表しているので、文字列型が複数ある場合は、

×   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "( Ljava/lang/String; Ljava/lang/String)V")){
○   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "( Ljava/lang/String; Ljava/lang/String;)V")){

最後に「;」が必要。

こちら様 が参考になりました。

エラー・メッセージ Failed to find static method id of ~ で、半日悩んで、やっと解消できたーと思ったら、実は役に立たない機能だったわけですよ。そんなのばっかり。

スポンサーサイト

コメント

非公開コメント