コード例 #1
0
/** create the plugin by name */
PluginProtocol* PluginFactory::createPlugin(const char* name)
{
    PluginProtocol* pRet = NULL;
    do
    {
        if (name == NULL || strlen(name) == 0) break;

        std::string jClassName = ANDROID_PLUGIN_PACKAGE_PREFIX;
        jClassName.append(name);
        PluginUtils::outputLog("PluginFactory", "Java class name of plugin %s is : %s", name, jClassName.c_str());

        PluginJniMethodInfo t;
        if (! PluginJniHelper::getStaticMethodInfo(t
                , "org/cocos2dx/plugin/PluginWrapper"
                , "initPlugin"
                , "(Ljava/lang/String;)Ljava/lang/Object;"))
        {
            PluginUtils::outputLog("PluginFactory", "Can't find method initPlugin in class org.cocos2dx.plugin.PluginWrapper");
            break;
        }

        jstring clsName = t.env->NewStringUTF(jClassName.c_str());
        jobject jObj = t.env->CallStaticObjectMethod(t.classID, t.methodID, clsName);
        t.env->DeleteLocalRef(clsName);
        t.env->DeleteLocalRef(t.classID);
        if (jObj == NULL)
        {
            PluginUtils::outputLog("PluginFactory", "Can't find java class %s", jClassName.c_str());
            break;
        }

        if (! PluginJniHelper::getStaticMethodInfo(t
                , "org/cocos2dx/plugin/PluginWrapper"
                , "getPluginType"
                , "(Ljava/lang/Object;)I"))
        {
            PluginUtils::outputLog("PluginFactory", "Can't find method getPluginType in class org.cocos2dx.plugin.PluginWrapper");
            break;
        }
        int curType = t.env->CallStaticIntMethod(t.classID, t.methodID, jObj);
        t.env->DeleteLocalRef(t.classID);
        PluginUtils::outputLog("PluginFactory", "The type of plugin %s is : %d", name, curType);

        switch (curType)
        {
        case kPluginAds:
            pRet = new ProtocolAds();
            break;
        case kPluginAnalytics:
            pRet = new ProtocolAnalytics();
            break;
        case kPluginIAP:
            pRet = new ProtocolIAP();
            break;
        case kPluginShare:
            pRet = new ProtocolShare();
            break;
        case kPluginUser:
            pRet = new ProtocolUser();
            break;
        case kPluginSocial:
            pRet = new ProtocolSocial();
            break;
        case kPluginData:
            pRet = new ProtocolData();
            break;
        case kPluginBaaS:
            pRet = new ProtocolBaaS();
            break;
        default:
            break;
        }

        if (pRet != NULL)
        {
            pRet->setPluginName(name);
            PluginUtils::initJavaPlugin(pRet, jObj, jClassName.c_str());
        }
    } while(0);

    return pRet;
}