cocos2d clipboard

cocos2d android编译参考Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境 这篇文章

需求:点击游戏面板中的按钮,将一个文本框中的字符串放入到剪贴板中。

平台: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方法的。


cocos2d lua android 版本

项目是有cocos code ide生成,cocos2d版本是3.4

将项目加入到eclipse中,配置jdk,sdk,ndk等等。。。




选择android项目。


打开之后发现很多报错。

方法一:将frameworks\cocos2d-x\cocos\platform\android\java\src目录拷贝到项目的src下。

方法二:添加源码依赖。



在CocosHelper中加入java代码:和上面的是一样的。


lua代码:

local luaj = require "cocos.cocos2d.luaj"
    local className = "org/cocos2dx/lib/Cocos2dxHelper"
    local args = {"hello clipboard"}
    local sigs = "(Ljava/lang/String;)Z"
    local ok,ret  = luaj.callStaticMethod(className,"setClipboardContent",args,sigs)

生成apk:

方法一:在frameworks\runtime-src\proj.android目录下输入cocos compile -p android

方法二:cocos code ide打包apk



碰到的问题:在打包apk的时候,会出现一大堆报错:

collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libcocos2dlua.so] Error 1
make.exe: Leaving directory `F:/project/cocos2d/CocosLuaGame2/frameworks/runtime-src/proj.android'
Running command: compile
Building mode: debug
running: '"D:\Program Files (x86)\android\adt-bundle-windows-x86_64-20140702\sdk\tools\android" update project -t android-19 -p F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android'

running: '"D:\Program Files (x86)\android\adt-bundle-windows-x86_64-20140702\sdk\tools\android" update lib-project -p F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android\../../cocos2d-x/cocos/platform/android/java -t android-19'

building native
NDK build mode: release
NDK_TOOLCHAIN_VERSION: 4.9
running: '"D:\environment\android-ndk-r10d\ndk-build" -C F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android -j5 NDK_MODULE_PATH=F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android\../../cocos2d-x;F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android\../../cocos2d-x/cocos/;F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android\../../cocos2d-x/external;F:\project\cocos2d\CocosLuaGame2\frameworks\runtime-src\proj.android\../../cocos2d-x/cocos/scripting NDK_TOOLCHAIN_VERSION=4.9'

Ndk build failed!

删除frameworks\runtime-src\proj.android\obj 下的东西,再次打包apk,就可以了。估计是由于我已经用方法一打包过了apk的原因。


安装apk,测试一下,搞定。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值