cocos2d-xを使って開発しているときに、C++からJavaのコードを呼び出し、返り値としてStringを受け取りたいときがありました。
そのやり方のメモ。(もっとカンタンな方法あるのかも?)
C++側
std::string NativeUtils::getSystemData() { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, "com/example/NativeUtils", "getString", "()Ljava/lang/String;")) { jstring jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); const char* str = t.env->GetStringUTFChars(jstr, 0); char* resStr = strdup(str); t.env->ReleaseStringUTFChars(jstr, str); t.env->DeleteLocalRef(t.classID); return resStr; }else{ return ""; } }
Java側
public class NativeUtils { public static String getString(){ return "何かしらのテキストだよ"; } }
ポイントは、CallStaticObjectMethod
でjavaのコードを呼び出して、その返り値をjstring
にキャストして、charにするためにゴニョゴニョするところでしょうか。