cocos项目实现复制功能

cocos c++项目实现复制功能

做棋牌的时候,需要频繁添加各种微信号,这时就有了直接复制微信号的需求,下面总结一下。

由于我们项目是在win下用c++写逻辑的,所以要实现复制这种系统功能就要分平台写。最先要处理一下公用接口。

为了方便,我直接写在了cocos的platform下面,这里cocos做了很好的分平台的移植。找到platform下面的接口文件:
cocos项目实现复制功能_第1张图片
在这个文件里面添加跨平台所需要的功能接口:
cocos项目实现复制功能_第2张图片
打开CCApplication.h看一下,这种跨平台的逻辑写得很清楚:cocos项目实现复制功能_第3张图片
当我们在代码中调用函数例如:

Application::getInstance()->copyToClipboard("test");

不同平台的编译器会找到自己的Application类,来调用各个不同平台Application类中重写的ApplicationProtocol中的虚函数。

首先是win下,找到win平台下的Application文件:cocos项目实现复制功能_第4张图片
重写复制函数:

bool Application::copyToClipboard(const std::string &text)
{
    return 0;
}

然后是ios平台,找到ios下的Application文件:cocos项目实现复制功能_第5张图片
因为.mm文件可以c++,oc混编,所以头文件里面和c++头文件一样声明就好,.mm文件里面重写复制函数:

bool Application::copyToClipboard(const std::string &text)
{
    //把char*转换成OC的NSString
    NSString *nsMessage= [NSString stringWithUTF8String:text.c_str()];
    //获得ios的剪切板
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    //改变剪切板的内容
    pasteboard.string = nsMessage;
    return 0;
}

因为oc可以混编的关系,cocos写ios平台的东东一直都不麻烦,相比起来安卓平台稍微麻烦一丢丢。同样的,先找到安卓下的Application文件:
cocos项目实现复制功能_第6张图片
重写复制函数:

bool Application::copyToClipboard(const std::string &text)
{
    return copyToClipboardJNI(text.c_str());
}

这里的copyToClipboardJNI函数是写在
cocos项目实现复制功能_第7张图片
文件中的jni函数,来实现c++,java的交互。jni函数如下:

extern bool copyToClipboardJNI(const char* text) {
    JniMethodInfo t;
    bool ret = false;
    //"copyToClipboard":java中的函数名,(Ljava/lang/String;)Z:参数类型和返回值类型
    if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "copyToClipboard", "(Ljava/lang/String;)Z")) {
        jstring stringArg = t.env->NewStringUTF(text);
        ret = t.env->CallStaticBooleanMethod(t.classID, t.methodID, stringArg);

        t.env->DeleteLocalRef(t.classID);
        t.env->DeleteLocalRef(stringArg);
    }
    return ret;
}

最后在java目录下找到相应的.java文件,实现安卓平台下的复制函数:
cocos项目实现复制功能_第8张图片

public static boolean copyToClipboard(String text)
    {
        try
        {
            final String ftext = text;
            Runnable runnable = new Runnable() {
                public void run() {
                    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) Cocos2dxActivity.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
                    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", ftext);
                    clipboard.setPrimaryClip(clip);
                }
            };
            ((Cocos2dxActivity)sActivity).runOnUiThread(runnable);

        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        return false;
    }

对跨平台不熟悉的童鞋们主要熟悉一下jni的代码,里面的各个参数的填写,整个复制功能不涉及到权限神马的还是很简单的。

你可能感兴趣的:(cocos2dx)