关于Coco2dx的KTPlay的接入

首先如果你像我一样是在Xcode中编写cpp文件,然后再eclipse中写java文件,那么,你需要同时配置好ios和android,并且在使用KTPlay的时候导入头文件时需要区别对待:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include “KTLeaderboardPaginatorC.h”
#include “KTErrorC.h”
#include “KTPlayC.h”
#include “KTLeaderboardC.h”
#include “KTAccountManagerC.h”
#include “KTUserC.h”
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include “…/proj.android/jni/ktplay/KTLeaderboardPaginatorC.h”
#include “…/proj.android/jni/ktplay/KTErrorC.h”
#include “…/proj.android/jni/ktplay/KTPlayC.h”
#include “…/proj.android/jni/ktplay/KTLeaderboardC.h”
#include “…/proj.android/jni/ktplay/KTAccountManagerC.h”
#include “…/proj.android/jni/ktplay/KTUserC.h”

#endif

1.IOS的接入问题
按照教程一步步接入之后,变的时候发现各种缺少lib***** iOS.a
解决方案 添加两个库:GameController.framework和MediaPlayer.framework

2.android的接入
添加库工程等等就不说了,官方文档写得很清楚了,关键是jni部分
我选择在jni下面新建一个文件夹ktplay,放入头文件和相关.so库,并创建一个Android.mk文件
里面内容如下:
LOCAL_PATH := (call my-dir) #prebuild KTPlay library include (CLEAR_VARS)
LOCAL_MODULE := libKTPlay
LOCAL_SRC_FILES := http://libktplay.so/
LOCAL_MODULE_FILENAME := libKTPlay
include (PREBUILT_SHARED_LIBRARY) include (CLEAR_VARS)
LOCAL_MODULE := libKTAccountmanager
LOCAL_SRC_FILES := http://libktaccountmanager.so/
LOCAL_MODULE_FILENAME := libKTAccountmanager
include (PREBUILT_SHARED_LIBRARY) include (CLEAR_VARS)
LOCAL_MODULE := libKTFriendship
LOCAL_SRC_FILES := http://libktfriendship.so/
LOCAL_MODULE_FILENAME := libKTFriendship
include (PREBUILT_SHARED_LIBRARY) include (CLEAR_VARS)
LOCAL_MODULE := libKTLeaderboard
LOCAL_SRC_FILES := http://libktleaderboard.so/
LOCAL_MODULE_FILENAME := libKTLeaderboard
include $(PREBUILT_SHARED_LIBRARY)

只是比官方文档里的内容多了一行LOCAL_PATH := $(call my-dir)

然后回到主工程的Android.mk文件,在include $(BUILD_SHARED_LIBRARY) 之前加上 LOCAL_SHARED_LIBRARIES:= libKTPlay libKTAccountmanager libKTFriendship libKTLeaderboard
这一点跟官方文档说明一样,如果已经存在LOCAL_SHARED_LIBRARIES需要变成LOCAL_SHARED_LIBRARIES += libKTPlay libKTAccountmanager libKTFriendship libKTLeaderboard
显然因为我们在cocos的代码里面用到了ktplay,所以在编译cocos代码的时候才需要加上对ktplay共享库的引用

既然添加了对ktplay共享库的引用,那么ktplay共享库就要在cocos代码编译之前先编译出来,所以在主工程的Android.mk文件最一开始需要将LOCAL_PATH := (call my-dir)替换成: MY_LOCAL_PATH := (call my-dir)
LOCAL_PATH := (MY_LOCAL_PATH) include (call all-subdir-makefiles)
LOCAL_PATH := (MY_LOCAL_PATH) 解释一下,LOCAL_PATH := (call my-dir)是所有.mk文件在一开始必须定义的。
MY_LOCAL_PATH := $(call my-dir)保存cocos代码编译时需要的LOCAL_PATH

LOCAL_PATH := (MY_LOCAL_PATH) include (call all-subdir-makefiles)这两句就是先编译当前.mk文件所在目录下所有子目录中的.mk文件

LOCAL_PATH := $(MY_LOCAL_PATH)子目录的.mk文件编译完了我们要还原LOCAL_PATH,然后开始编译cocos

最后我们的cocos主工程的.mk文件应该大概是这个样子:

MY_LOCAL_PATH := (call my-dir) LOCAL_PATH := (MY_LOCAL_PATH)

include $(call all-subdir-makefiles)

LOCAL_PATH := $(MY_LOCAL_PATH)

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/extensions)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

MY_FILES_PATH := (LOCAL_PATH) \ (LOCAL_PATH)/…/…/Classes

MY_FILES_SUFFIX := .cpp .c

My_All_Files := (foreach src_path,(MY_FILES_PATH), (shell find (src_path) -type f) )
My_All_Files := (My_All_Files:(MY_CPP_PATH)/./=$(MY_CPP_PATH))
MY_SRC_LIST := (filter (MY_FILES_SUFFIX),(My_All_Files)) MY_SRC_LIST := (MY_SRC_LIST:(LOCAL_PATH)/%=%) LOCAL_SRC_FILES := (MY_SRC_LIST)

LOCAL_C_INCLUDES := (LOCAL_PATH)/../../Classes\ (LOCAL_PATH)/…/…/cocos2d/extensions\

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static

LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static

LOCAL_WHOLE_STATIC_LIBRARIES += spine_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static

LOCAL_SHARED_LIBRARIES:= libKTPlay libKTAccountmanager libKTFriendship libKTLeaderboard
include $(BUILD_SHARED_LIBRARY)

(call import-module,.) (call import-module,audio/android)
$(call import-module,extensions)

$(call import-module,Box2D)

$(call import-module,editor-support/cocosbuilder)

$(call import-module,editor-support/spine)

$(call import-module,editor-support/cocostudio)

$(call import-module,network)

3.关于android的接入
以前没怎么写过要使用jni的程序,所以这一块花了很长,最后还是先把.mk文件的写法看了一下才懂了每句话的意思。KTPlay的文档都是基于你懂jni来写的,对于我这种不懂的人来说就蛋疼了。这里我把重要的几点说明一下,就算你不想按照我在2里面的方式接入也不会出问题

第一点:KTPlay的编译需要在Cocos编译之前,原因很简单,coco代码里用到了KTPlay

第二点:LOCAL_SHARED_LIBRARIES:= libKTPlay libKTAccountmanager libKTFriendship libKTLeaderboard需要加在
include $(BUILD_SHARED_LIBRARY) 之前,原因还是一样,coco代码里用到了KTPlay

第三点:头文件的引用,目录地址是相对于cpp文件目录的地址,所以是…/proj.android/jni/***这样子

搞清楚这三点,就算是你按照官方文档接入也不会出错了

文档还有其它坑的。慢慢踩。

接入android版时遇到这个问题。
文档中对应这一段
2.2.1.3 初始化
在游戏主 Activity 类的 onCreate 方法中,调用 KTPlay 类的 startWithAppKey 方法初始化KTPlay。
KTPlay.startWithAppKey(Activity 对象,你的AppKey,你的AppSecret);
注意事项
KTPlay的.so文件会在调用KTPlay.startWithAppKey时装载,请确保游戏在装载自己的.so文件之前已经调用了KTPlay.startWithAppKey方法,因为游戏的.so文件引用到KTPlay的.so文件。

而游戏的so文件是在静态代码段中加载的,先于onCreate方法调用。就达不到注意事项中描述的条件了。
public void onCreate(Bundle savedInstanceState) {
instance = this;
super.onCreate(savedInstanceState);
KTPlay.startWithAppKey(this, “xxxxx”, “xxxxx”);
}

static {
    System.loadLibrary("game");
}

这个怎么解决?