做棋牌的时候,需要频繁添加各种微信号,这时就有了直接复制微信号的需求,下面总结一下。
由于我们项目是在win下用c++写逻辑的,所以要实现复制这种系统功能就要分平台写。最先要处理一下公用接口。
为了方便,我直接写在了cocos的platform下面,这里cocos做了很好的分平台的移植。找到platform下面的接口文件:
在这个文件里面添加跨平台所需要的功能接口:
打开CCApplication.h看一下,这种跨平台的逻辑写得很清楚:
当我们在代码中调用函数例如:
Application::getInstance()->copyToClipboard("test");
不同平台的编译器会找到自己的Application类,来调用各个不同平台Application类中重写的ApplicationProtocol中的虚函数。
首先是win下,找到win平台下的Application文件:
重写复制函数:
bool Application::copyToClipboard(const std::string &text)
{
return 0;
}
然后是ios平台,找到ios下的Application文件:
因为.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文件:
重写复制函数:
bool Application::copyToClipboard(const std::string &text)
{
return copyToClipboardJNI(text.c_str());
}
这里的copyToClipboardJNI函数是写在
文件中的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文件,实现安卓平台下的复制函数:
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的代码,里面的各个参数的填写,整个复制功能不涉及到权限神马的还是很简单的。