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関数を呼び出しました。

このエントリーをはてなブックマークに追加