Cocos2d-x通过Jni实现Cocos2d-x界面跳转到新的Activity
在Cocos2d-x开发中,有时需要从Cocos2d-x界面跳转到新的Android Activity,本文将详细介绍如何通过JNI(Java Native Interface)实现这一功能。
1、Java层
1.1 添加新类 UserInfoActivity.java
首先,在 org.cocos2dx.cpp 目录下添加新类 UserInfoActivity.java。该类用于显示从Cocos2d-x传递过来的信息,具体代码如下:
package org.cocos2dx.cpp;
import com.pactera.jni.R; // 注意路径
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Intent;
public class UserInfoActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.userinfo); // 原代码此处可能有误,后续又重新设置了布局
Intent intent = getIntent();
String string = intent.getStringExtra("name");
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(string);
setContentView(textView);
}
}
1.2 修改 AppActivity.java 类
AppActivity.java 类继承自 Cocos2dxActivity,主要负责设置OpenGL信息、加载Cocos2d-x库以及提供JNI调用的Java方法。代码如下:
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.content.Intent;
import android.os.Bundle;
public class AppActivity extends Cocos2dxActivity {
public static final int SHOW_DIALOG = 0x0001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// 设置OpenGL的相关信息
@Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// GuideLayer should create stencil buffer
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
return glSurfaceView;
}
// 加载Cocos2d-x的库
static {
System.loadLibrary("cocos2dcpp");
}
public static void Share() { // Jni的Java层native代码,在Jni目录下的test.cpp实现,并被C++调用
Intent intent = new Intent();
intent.setClass(AppActivity.getContext(), UserInfoActivity.class);
intent.putExtra("name", "Hello World");
AppActivity.getContext().startActivity(intent);
}
}
2、Jni层
在 jni 目录下添加 test 类的 .h 和 .cpp 文件,用于实现C++调用Java方法的功能。
2.1 test.h 文件
#ifndef TEST_H_
#define TEST_H_
extern "C" {
// C++调Java的函数接口,该方法在HelloWorldScene中menuCallback函数中使用。
void Share();
}
#endif
2.2 test.cpp 文件
#include "test.h"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"
#include "../../../Classes/JniTest.h" // 需确保该文件存在
#define CLASS_NAMENEW "org/cocos2dx/cpp/AppActivity"
using namespace cocos2d;
extern "C" {
void Share() {
bool hasMethod;
JniMethodInfo t;
hasMethod = JniHelper::getStaticMethodInfo(t, CLASS_NAMENEW, "Share", "()V");
if (hasMethod) {
log("Share function");
if (t.methodID) {
t.env->CallStaticVoidMethod(t.classID, t.methodID);
log("function share() was called");
} else {
log("function share was not called");
}
} else {
log("function share was not found");
}
}
}
3、C++层
在 HelloWorld 类的 menuCloseCallback 方法中调用 Share 函数,实现从Cocos2d-x界面跳转到新的Activity。
void HelloWorld::menuCloseCallback(Ref* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
Share();
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
4、注意事项
需要添加平台判断头文件,确保在Android平台下包含 test.h 文件。
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../proj.android/jni/hellocpp/test.h"
#endif
5、运行结果
按照上述步骤完成代码编写后,编译并运行项目。当触发 HelloWorld::menuCloseCallback 方法时,应用将从Cocos2d-x界面跳转到 UserInfoActivity,并显示传递的信息 “Hello World”。
通过以上步骤,我们成功实现了在Cocos2d-x中通过JNI跳转到新的Android Activity的功能。