c++側からIOS・androidのnative関数を呼び出す方法
c++側からAndroid・IOSのnative機能を呼び出し方法についてです。
なんかのサイトを参考にしたと思うんですが、はじめ書いたのが1年前なので忘れた
ios・androidのNativeで実行するための共通ファイルを作る
まず、cocos2dxのc++がネイティブの関数を呼び出すためのファイルNativeLancher.cpp,NativeLancher.mmを作りました(名前はなんでもいい)。
ios側では、NativeLancher.mmを呼び出し、android側では、NativeLancher.cppを呼び出します。
NativeLancher.mmでは、cocos2dxのプロジェクトを作った際に作られているRootViewControllerクラスの関数を呼び出しました。
当然RootViewControllerにはNativeで実行したい内容の関数が書いてあります。
RootViewControllerを呼び出すためには、以下の用に書きました。
void NativeLauncher:: sendCentralData(std::string sendData) {
RootViewController* rc = [UIApplication sharedApplication].keyWindow.rootViewController;
// central peripheral両方にセット
[rc sendCentralData:@(sendData.c_str())];
}
これで、ios側のネイティブ関数を呼び出すことができました。
続いて、android側のNativeLancher.cppを見ていきます。
androidはjavaで書いているので、Native関数を呼び出すためには、jniを経由する必要があります。
#define CLASS_NAME "org/cocos2dx/cpp/AppActivity"
void NativeLauncher::sendCentralData(std::string data){
cocos2d::JniMethodInfo methodInfo;
if (!cocos2d::JniHelper::getStaticMethodInfo(methodInfo, CLASS_NAME, "sendCentralData", "(Ljava/lang/String;)V")) {
return;
}
jstring arg1 = methodInfo.env->NewStringUTF(data.c_str());
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, arg1);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
cocos2dxのデフォルトActivityはAppActivityとなっているので、AppActivityに対象のstatic関数を書き、
その中でNativeの機能を書いています。
/**
* jni Native Method
* Central dataを送信
*/
public static void sendCentralData(String data) {
if (activity.isBleEnabled) {
activity.bleCharacteristic.setValue(data);
activity.bleGatt.writeCharacteristic(activity.bleCharacteristic);
}
}
いいか悪いかは置いておいておき、こんな感じでandroid・ios側からNative関数を呼び出しました。