使用加载的uijson文件中的按钮时,在按钮的响应函数里面删除掉(this->removeFromParent();)ui所在的层时,发生崩溃。解决办法:修改UIWidget.cpp文件中releaseUpEvent函数,如图:
1、在cocos2d-x的安卓java代码中调用c++的方法:
第一,首先在项目下->src->包名,右键->New->Class,创建一个java类,此类中声明了需要调用的c++库xx.so导出函数。例如输入:
package com.example.firstandroid;
public class CHello {
public native String getString();
public static native int getNUm();
static{
System.loadLibrary("cppTest");
}
}
第二,选中项目,右键->Android Tools->Add Native Support,然后输入.so的名称,自动生成jni目录;目录下有2个文件Android.mk,xxx.cpp。mk文件中看到模块名称以及对应的cpp,可以允许多个cpp,使用空格或者\换行符。
第三,再进入cmd,进入到工程名\bin\classes下,输入命令javah -d ../../jni –jni com.example.firstandroid.CHello,将会在jni目录下产生com_example_firstandroid_CHello.h,其中根据之前创建的java类声明了c++类。接下来,在jni下面的xxx.cpp中编写具体函数的实现。例如:
#include <jni.h>
#include "com_example_firstandroid_CHello.h"
/*
* Class: com_example_firstandroid_CHello
* Method: getString
* Signature: ()Ljava/lang/String;
*/
jstring Java_com_example_firstandroid_CHello_getString
(JNIEnv *env, jobject obj)
{
return env->NewStringUTF("Hello Java");
}
/*
* Class: com_example_firstandroid_CHello
* Method: getNUm
* Signature: ()I
*/
jint Java_com_example_firstandroid_CHello_getNUm
(JNIEnv *env, jclass clas)
{
return 0;
}
C++库已经写好了,现在到主activity中去调用。例如添加:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CHello h = new CHello();
System.out.println(h.getString());
}
直接run as,android application就可以了,在LoaCat中可以看到,程序运行起来后打印了“Hello Java”。
注意:有一个问题就是,好像Add Native Support选项只能被选择一次,就是添加一次jni之后就不能再添加了。
2、在cocos2dx中c++代码调用java代码的方法:
在TaFang工程->src->org.cocos2dx.cpp下面,创建java类Tools,输入:
package org.cocos2dx.cpp;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
public class Tools {
private static Context context = null;
public static void init(Context context){
Tools.context = context;
}
public static void showToast(String msg){
// Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); // 不能直接在这里调用,因为android线程不允许其他线程调用
Message m = new Message();
m.obj = msg;
handler.sendMessage(m);
}
private static final Handler handler = new Handler(){
public void handlerMessage(android.os.Message msg){
Toast.makeText(context, (String)msg.obj, Toast.LENGTH_SHORT).show();
};
};
}
然后在cocos2dx中代码执行流程中输入:
#include "platform/android/jni/JniHelper.h"
JniMethodInfo minfo;
JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/Tools", "showToast", "(Ljava/lang/String;)V");
JniHelper::getEnv()->CallStaticVoidMethod(minfo.classID, minfo.methodID, JniHelper::getEnv()->NewStringUTF("Hello Java"));
即可实现调用showToast函数。
3、setDesignResolutionSize()不能放在if(!glview){}里面,否则没有效果。
4、cocos2d项目编译apk时,需要对proj.android/jni/Android.mk文件添加.cpp和.h路径,若路径太多时,可以使用下述方法进行添加: