Cocos2d-xでアプリのバージョンを取得する
Cocos2d-xからiOS,Androidのアプリバージョンを取得する処理を作成したのでメモします。
JNIのクラスなど、ネイティブ連携のクラスはCocos2d-x上からTwitterにツイートする - おかひろの雑記などと同じ形で作成してあるとします。
今回使用したバージョン
- Cocos2d-x 3.2
NativeCodeLauncher.h
// バージョン番号取得 static std::string getVersionNo();
iOS向け
NativeCodeLauncher.mm
// バージョン番号取得 static std::string static_getVersionNo() { NSString *versionNo = [NativeCodeLauncher getVersionNo]; std::string ret([versionNo UTF8String]); return ret; } ... namespace Cocos2dExt { // バージョン番号取得 std::string NativeCodeLauncher::getVersionNo() { return static_getVersionNo(); }
NativeCodeLauncher_objc.h
// バージョン番号取得
+(NSString *)getVersionNo;
NativeCodeLauncher_objc.mm
// バージョン番号取得 +(NSString *)getVersionNo { return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; }
Android向け
NativeCodeLauncher.cpp
// バージョン番号取得 std::string NativeCodeLauncher::getVersionNo() { return getVersionNoJNI(); }
NativeCodeLauncherJni.h
// バージョン番号取得 extern std::string getVersionNoJNI();
NativeCodeLauncherJni.cpp
// バージョン番号取得 std::string getVersionNoJNI() { JniMethodInfoEx methodInfo; if (!getStaticMethodInfo(methodInfo, "getVersionNo", "()Ljava/lang/String;")) { return ""; } jstring retString = (jstring)methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID); // jstringをstd::stringに変換 std::string ret = JniHelper::jstring2string(retString); // 解放処理 methodInfo.env->DeleteLocalRef(retString); methodInfo.env->DeleteLocalRef(methodInfo.classID); return ret; }
AppActivity.java
// バージョン番号取得 public static String getVersionNo() { PackageManager pm = me.getContext().getPackageManager(); String versionName = ""; try { PackageInfo packageInfo = pm.getPackageInfo(me.getContext().getPackageName(), 0); versionName = packageInfo.versionName; } catch(NameNotFoundException e) { e.printStackTrace(); } return versionName; }
戻り値の型はstd::stringがいいと思います。const char*にすると、Androidでうまくいきませんでした。
(私のやり方が良くなかったのかもしれません。)