cocos2djs游戏sdk接入
主要登陆接口和支付接口(一般认真的跟着接入文档走 基本没什么问题 但是细节上会有一些区别和误区)
1.首先从sdk官网或运营获得参数 sdk包 以及sdk接入文档(一般在sdk包里面,有的文档在网站上)
2.跟着文档将资源拷贝到工作空间到如jar包资源等文件 有的直接作为library导入到项目工程里
拷贝资源 注意:
(1)如果有assets 里面的文件需要拷贝 由于cocos run命令会自动重新生成文件 主要根据build-cfg.json配置文件生成的那么 把你需要拷贝的文件加在一个你知道的相对路径
再修改配置如下
{
"ndk_module_path" :[
"../../js-bindings",
"../../js-bindings/cocos2d-x",
"../../js-bindings/cocos2d-x/cocos",
"../../js-bindings/cocos2d-x/external"
],
"copy_resources": [
{
"from": "../../../src",
"to": "src"
},
{
"from": "../../../res",
"to": "res"
},
{
"from": "../../../main.js",
"to": ""
},
{
"from": "../../../project.json",
"to": ""
},
{
"from": "../../js-bindings/bindings/script",
"to": "script"
},
{
"from": "你的路径",
"to": ""
}
{
"from": "你的路径",
"to": ""
}
]
}
(2)如果libs的armeabi 和armeabi-v7a文件夹下需要添加库文件 但是也会被cocos run命令 覆盖
解决办法:
比如要加的文件为ibweibosdkcore.so
先把文件放入jni文件夹,再修改jni下的android.mk文件
LOCAL_PATH := $(call my-dir)
# ———————————
include $(CLEAR_VARS)
LOCAL_MODULE :=weibosdkcore
LOCAL_SRC_FILES := libweibosdkcore.so
include $(PREBUILT_SHARED_LIBRARY)
# ———————————
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2djs_shared
LOCAL_MODULE_FILENAME := libcocos2djs
LOCAL_SRC_FILES := hellojavascript/main.cpp \
../../Classes/AppDelegate.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_STATIC_LIBRARIES := cocos_jsb_static
LOCAL_EXPORT_CFLAGS := -DCOCOS2D_DEBUG=2 -DCOCOS2D_JAVASCRIPT
include $(BUILD_SHARED_LIBRARY)
$(call import-module,bindings)
(3)为了全部手机适配测试很多手机时,我们注意到一个问题同样的包,只能在部分手机上运行,有的手机老是崩溃,于是查找问题,
运行游戏打log输出是发现 程序找不到armeabi-v7a 的libcocos2djs.so文件
然后就去文件夹找 果然没有 最后找到解决办法
修改jni的Application.mk文件
APP_STL := gnustl_static
# Uncomment this line to compile to armeabi-v7a, your application will run faster but support less devices
APP_ABI := armeabi armeabi-v7a(增加内容armeabi-v7a)
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
APP_LDFLAGS := -latomic
ifeq ($(NDK_DEBUG),1)
APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
APP_OPTIM := debug
else
APP_CPPFLAGS += -DNDEBUG
APP_OPTIM := release
endif
结果在运行 完美运行
后来又发现一个崩溃问题 程序找不到arm64-v8a mips mips64 x86等等的libcocos2djs.so文件
我以为用原来的方法可以解决 结果 cocos run 一运行 就报错 。。。。。。。
最后 无赖解决办法 直接删除了除了arm64-v8a mips mips64 x86等等文件夹
写了好久的sdk接入代码 终于可以试试 能不能行了
3.接下来是代码部分
(1)AndroidManifest.xml的配置
一般情况下 配置参数 如appid key等等 每个sdk不一样
特别有的sdk 需要修改启动类为sdk的闪屏类 就要注意把自己的启动类配置删除了 要不然你装在手机上就会有两个图标或者你添加了多少个下面这样的代码就会有多少个app图标装在手机上
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
(2)js和java互相调用
js->java
jsb.reflection.callStaticMethod("java类文件src下完整路径","方法名","(数据类型列表)V" , 参数1,参数2,...);
列:jsb.reflection.callStaticMethod("org/cocos2dx/javascript/TaoSY/staticTaoSYSDK","login","(ZFILjava/lang/String;)V" , true,1.2,1,"参数");
java类文件全路径:src一下全部路径最后一个是java文件名如 staticTaoSYSDK.java
方法名:不解释
数据类型列表:
数据类型 | int | float | string | bool | ||
---|---|---|---|---|---|---|
表示方式 | I | F | Ljava/lang/String; | Z |
注意 :1.没有参数也要传一个 "()V" 2.类型列表的类型之间不需要分隔符
java->js
1.先将sdk回调监听到的数据转换成json
JSONObject jsonObject = new JSONObject(var1);
String data = jsonObject.toString();
2.再讲数据发送到自己的js里面
String arg = String.format("bs.SDKManager.getInstance().onLoginEvent("+data+")");
Cocos2dxJavascriptJavaBridge.evalString(arg);
注意:Cocos2dxJavascriptJavaBridge 一定要在GL线程中执行
Activity.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString(event);
}
});
2.再讲数据发送到自己的js里面
(3)接入各种sdk接口 以及sdk各种监听
这个时候我遇到的问题有
安卓退出键调用问题
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
// TODO 简单的安卓是否退出询问界面
AlertDialog.Builder builder = new Builder(SDKManager.getContext());
builder.setMessage("确定要退出吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
String arg = String.format("cc.director.end()");
SDKManager.dispatchEvent(arg);
}
});
//也可以在此处调用sdk的退出接口(如果sdk只有接口没有界面的话)
}
else
{
return super.dispatchKeyEvent(event);
//不要忽略这个 网上很多地方只有说怎么调用安卓退出键 却忽略了 调用父类 以至于 玩游戏时监听不到音量控制键了
}
return true;
}
切换账号接口
这里的问题是 切换账号一定要先给自己的服务器发消息 退出自己的游戏然后在执行sdk重新登陆
4