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,测试一下,搞定。