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 ~ で、半日悩んで、やっと解消できたーと思ったら、実は役に立たない機能だったわけですよ。そんなのばっかり。