Cocos2d-x通过Jni实现Cocos2d-x界面跳转到新的Activity

2015年03月24日 16:06 0 点赞 0 评论 更新于 2025-11-21 18:29

在Cocos2d-x开发中,有时需要从Cocos2d-x界面跳转到新的Android Activity,这可以通过JNI(Java Native Interface)来实现。下面将详细介绍实现步骤。

1. Java层

1.1 添加新类 UserInfoActivity.java

首先,在 org.cocos2dx.cpp 目录下添加新类 UserInfoActivity.java。该类可根据需求自行定义,代码如下:

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 类是Cocos2d-x项目的主Activity类,需要在其中添加跳转逻辑。代码如下:

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 文件。

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 函数实现跳转。

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平台上包含相关的头文件。

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../proj.android/jni/hellocpp/test.h"
#endif

5. 运行结果

完成上述步骤后,编译并运行项目。当触发 menuCloseCallback 函数时,Cocos2d-x界面将跳转到新的 UserInfoActivity,并显示传递的信息。

通过以上步骤,就可以实现Cocos2d-x界面通过JNI跳转到新的Android Activity。

作者信息

feifeila

feifeila

共发布了 3994 篇文章