cocos2dx开发中,经常用到第三方sdk。(如分享,广告等)。这些sdk一般用java实现,且自带UI。此文介绍如何通过jni实现这些ui的正常显示。
当用c++调用java时,jni会启动子线程,在子线程中调用java,而我们知道子线程是不能用来显示UI的。所以,若要ui正常显示,就得做一些处理。
jni的相关内容,这里就不提了,下面只说说java层如何实现。我们以对话框为例
步骤很简单
1、 创建一个static的Handler showDlgHandler
2、 创建一个static的Runnable showDlgRunnable
3、 当c++调用java时,调用 showDlg.post(showDlg)
代码如下:
public class androidTF extends Cocos2dxActivity{
// 创建一个static的Handler private static Handler showDlgHandler = new Handler(); protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); // androidTF should create stencil buffer glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); return glSurfaceView; } static { System.loadLibrary("cocos2dcpp"); } public static void showDlg() { showDlgHandler.post(showDlgRunnable); } private static Runnable showDlgRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub conformOkCancle("titletest", "msgtest", "ok", "cancle"); } }; private static void conformOkCancle(CharSequence title, CharSequence msg, CharSequence ok, CharSequence cancle) { AlertDialog.Builder builder = new AlertDialog.Builder(Cocos2dxActivity.getContext()); builder.setTitle(title); builder.setMessage(msg); builder.setCancelable(false); builder.setPositiveButton(ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); builder.setNegativeButton(cancle, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); AlertDialog dlg = builder.create(); if(dlg != null) { dlg.show(); } } }