Cocos2d-x 안드로이드 개발에서 PluginProtocol만 원하는

5839 단어 cocos2d-x
자신의 절차서입니다.
뭔가 빠져 있으면 순차 추기합니다.

개발 환경



Cocos2d-x 3.3 rc0
NDK r9d

본고에서는 Cocos2d-x 3.3 rc0를 사용하고 있습니다만, 3.0 beta2 정도의 무렵부터 쓰러뜨리고 있는 수단이므로, 3.x라면 괜찮다고 생각합니다.

하고 싶은 일



광고를 표시시키거나, OS의 팝업을 표시시키거나, 외부로 천이시키거나 등을 실시할 때, 본가의 plugin-x가 꽤 사용하기 어렵고, 또한 개발의 진척도 수상하므로 PluginWrapper만 사용하고 싶다.
PluginWrapper는 plugin-x에서 공통으로 사용되고 있는, UI thread로의 처리를 좋은 느낌으로 해 주는 컴퍼넌트.

아래 준비



plugin-x 게시



비어있는 상태에서 게시하고 싶기 때문에 config.sh에서 불필요한 플러그인을 제거합니다.
퍼블리시 자체는 프로젝트 개별적으로 복사된 cocos2d 리소스에서도 할 수 있지만 PluginProtocol을 전체 프로젝트 통일하여 사용하고 싶은 경우는 본체쪽의 리소스로 하는 것이 좋다.
$ cd cocos2d/plugin/tools/
$ vi config.sh 

#define plugins array
#export ALL_PLUGINS=("flurry" "umeng" \
#"alipay" "nd91" "googleplay" \
#"admob" \
#"twitter" "weibo" \
#"qh360" "uc" \
#"facebook" "facebookads")

export ALL_PLUGINS=()
...


그리고 게시.
이 때, NDK 등의 패스를 듣기 때문에 적절히 입력한다.

$ ./publish.sh 

Please input the android-ndk path:
/Users/smith/lib/ndk/
Get ANDROID_NDK_ROOT=/Users/smith/lib/ndk

Please input the andoid-sdk path:
/Users/smith/lib/adt-bundle-mac-x86_64-20140702/sdk
Get ANDROID_SDK_ROOT=/Users/smith/lib/adt-bundle-mac-x86_64-20140702/sdk

Please input the ant tool path(such as '/Users/MyAccount/tools/ant/bin'):
/Users/smith/lib/apache-ant-1.9.4/bin
Get ANT_PATH=/Users/smith/lib/apache-ant-1.9.4/bin



mk 파일 편집



Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)

# パスの追加
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/plugin/publish)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_STATIC_LIBRARIES := cocos2dx_static

# .aの追加 PluginProtocol以外に使うものもついでに
LOCAL_WHOLE_STATIC_LIBRARIES += PluginProtocolStatic
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)

# モジュールの追加 PluginProtocol以外に使うものもついでに
$(call import-module,protocols/android) 
$(call import-module,audio/android)
$(call import-module,network)
$(call import-module,extensions)


또한 ndk 버전이나 버그, std 등의 복잡한 문제에서 개방되기 때문에 STL을 gnustl_static으로 만드는 것이 습관이되었습니다.

Application.mk
#APP_STL := c++_static
APP_STL := gnustl_static

libPluginProtocol 프로젝트 가져오기 및 참조 추가



Eclipse로 프로젝트를 가져온 다음 프로젝트 속성에서 libPluginProtocol에 대한 참조를 추가합니다.



ant에 서명 설정



이번 제목과는 관계없지만, 덤.

ant.properties

key.alias.password=my_fantastic_app_password
key.store.password=my_fantastic_app_password
key.store=/Users/smith/keys/apk/my_fantastic_app/my_fantastic_app_key
key.alias=my_fantastic_app_key


구현



PluginWraper를 사용하려면 적절하게 초기화해야합니다.

javaVM



main.cpp
#include "AppDelegate.h"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>
#include "PluginJniHelper.h"

#define  LOG_TAG    "main"
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

using namespace cocos2d;

void cocos_android_app_init (JNIEnv* env, jobject thiz)
{
    AppDelegate *pAppDelegate = new AppDelegate();

    JavaVM* vm;
    env->GetJavaVM(&vm);
    PluginJniHelper::setJavaVM(vm);
}


Cocos2dxActivity 및 Cocos2dxGLSurfaceView



ClippingNode라든지 사용하고 있으면, Cocos2dxGLSurfaceView는 필연적으로 설정하게 되지 않을까.

AppActivity.java
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.plugin.PluginWrapper;

public class AppActivity extends Cocos2dxActivity
{
    @Override public Cocos2dxGLSurfaceView onCreateView()
    {
        Cocos2dxGLSurfaceView glsView = super.onCreateView();
        glsView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

        PluginWrapper.init(this);
        PluginWrapper.setGLSurfaceView(glsView);

        H3NativeLifeCycle.applicationDidFinishLaunching();

        return glsView;
    }

    ...
}

사용법



GameFeat 등, Context나 Activity를 갖고 싶은 SDK에는 PluginWrapper.getContext() 를 준다.

NiceAdHandler.java
public static void initGamefeat()
{
    gamefeatController = new GameFeatAppController();
    gamefeatController.init(PluginWrapper.getContext());
    gamefeatController.setRefreshInterval(30);
    gamefeatController.activateGF(PluginWrapper.getContext(), false, true, true);
}

View에의 추가는 runOnMainThread로 실시할 필요가 있다.
그렇지 않으면 충돌합니다.

NiceAdHandler.java
public static void showIntersticial()
{
    PluginWrapper.runOnMainThread(new Runnable(){
        @Override
        public void run()
        {
            aidController.showDialog(AdController.DialogType.ON_EXIT);
        }
    });
}

특히 jni의 디버깅은 귀찮기 때문에 try/catch (Exception e)에서 오류 메시지를 보는 불행한 방법이 권장됩니다.

빌드



통과하지 않으면 미안해.
$ cocos run -p android -m release --ap 14

좋은 웹페이지 즐겨찾기