需求:点击游戏面板中的按钮,将一个文本框中的字符串放入到剪贴板中。
平台:win32,android,ios等多个平台。
游戏是用cocos2d开发的。
第一次写cocos2d跨平台的东西,慢慢摸索着也差不多搞出来了--搞定了android平台,在此记录一下。
给外界提供一个接口:
virtual bool copyToClipboard(const std::string &content);
我将它放在了Application,这个类本来每个平台都有它的Application-*.h类。
1:win32平台实现
不用多说这个是最熟悉的了。
bool Application::copyToClipboard(const std::string &content) { if (OpenClipboard(NULL)) { EmptyClipboard(); HGLOBAL clipbuffer; char* buffer; const char* str = content.c_str(); const int length = strlen(str); clipbuffer = GlobalAlloc(GMEM_DDESHARE,length+1); buffer = (char*)GlobalLock(clipbuffer); strcpy(buffer,str); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT,clipbuffer); CloseClipboard(); return true; } return false; }
2:android平台实现
bool Application::copyToClipboard(const std::string &content) { return copyToClipboardJNI(content.c_str()); }
copyToClipboardJNI我放在了Java_org_cocos2dx_lib_Cocos2dxHelper中,这里就是去调用android操作剪贴板。中间者是JniHelper
<pre name="code" class="cpp">extern bool copyToClipboardJNI(const char* content){ JniMethodInfo t; bool ret = false; if (JniHelper::getStaticMethodInfo(t,CLASS_NAME,"copyToClipboard","(Ljava/lang/String;)Z")) { jstring stringArg = t.env->NewStringUTF(content); ret = t.env->CallStaticBooleanMethod(t.classID,t.methodID,stringArg); t.env->DeleteLocalRef(t.classID); t.env->DeleteLocalRef(stringArg); } return ret; }
接下来就是写java 代码了:java提供的接口放在了Cocos2dxHelper中。
public static boolean copyToClipboard(String content){ clipboardmanager.setText(content); System.out.println("come here"); return true; }
public static void init(final Activity activity) { if (!sInited) { final ApplicationInfo applicationInfo = activity.getApplicationInfo(); Cocos2dxHelper.sCocos2dxHelperListener = (Cocos2dxHelperListener)activity; Cocos2dxHelper.sPackageName = applicationInfo.packageName; if (CocosPlayClient.isEnabled() && !CocosPlayClient.isDemo()) { Cocos2dxHelper.sFileDirectory = CocosPlayClient.getGameRoot(); } else { Cocos2dxHelper.sFileDirectory = activity.getFilesDir().getAbsolutePath(); } Cocos2dxHelper.nativeSetApkPath(applicationInfo.sourceDir); Cocos2dxHelper.sCocos2dxAccelerometer = new Cocos2dxAccelerometer(activity); Cocos2dxHelper.sCocos2dMusic = new Cocos2dxMusic(activity); Cocos2dxHelper.sCocos2dSound = new Cocos2dxSound(activity); Cocos2dxHelper.sAssetManager = activity.getAssets(); Cocos2dxHelper.nativeSetContext((Context)activity,Cocos2dxHelper.sAssetManager); clipboardmanager = (ClipboardManager)activity.getSystemService(Context.CLIPBOARD_SERVICE);//获取剪贴板服务 Cocos2dxBitmap.setContext(activity); sActivity = activity; sInited = true; } }
在这里犯了个错误,Cocos2dxHelper找错了位置。一共有两个:
我们选择前者,要不然会找不到copyToClipboard方法的。