Cocos2d-x调用Java最终实例代码

本文详细介绍了如何在Cocos2d-x游戏中调用Java代码,提供了一个实际的整合示例,帮助开发者实现跨平台功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HelloWorldScene.cpp

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>
#endif

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
    
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    /
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback) );
    pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition( CCPointZero );
    this->addChild(pMenu, 1);

    /
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);

    // ask director the window size
    CCSize size = CCDirector::sharedDirector()->getWinSize();

    // position the label on the center of the screen
    pLabel->setPosition( ccp(size.width / 2, size.height - 20) );

    // add the label as a child to this layer
    this->addChild(pLabel, 1);

    // add "HelloWorld" splash screen"
    CCSprite* pSprite = CCSprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    pSprite->setPosition( ccp(size.width/2, size.height/2) );

    // add the sprite as a child to this layer
    this->addChild(pSprite, 0);
    
    // JNI call test
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

	//
	// #1 : 静态,无参数,无返回值
	// #2 : 静态,有参数,无返回值
	// #3 : 静态,有参数,有返回值
	// #4 : 非静态,无参数,无返回值
	// #5 : 非静态,有参数,无返回值
	// #6 : 非静态,有参数,有返回值
	//
	
    JniMethodInfo minfo;
    
    // #1
	if (JniHelper::getStaticMethodInfo(minfo,"com/chen/FunctionTester",
		"TF_S_NP_NR", "()V"))
	{
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
    }
    
    // #2
    if(JniHelper::getStaticMethodInfo(minfo, "com/chen/FunctionTester",
		"TF_S_HP_NR","(I)V")) 
    {    
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,5);  
    }  
    
    // #3
    if (JniHelper::getStaticMethodInfo(minfo, "com/chen/FunctionTester",
		"TF_S_HP_HR","(I)I"))
	{
		jint __result;
		__result = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID, 5);
	}
	
	// 非静态方法的调用需要从一个静态方法中获得非静态方法所属的对象。也就是说,调用了一
	// 个返回值类型为java.lang.Object的静态方法
	jobject jobj;
	
	// #4
	if (JniHelper::getStaticMethodInfo(minfo, "com/chen/FunctionTester", 
		"getInstance", "()Ljava/lang/Object;"))
	{
		jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
		if (JniHelper::getMethodInfo(minfo, "com/chen/FunctionTester",
			"TF_US_NP_NR", "()V"))
		{
			 minfo.env->CallVoidMethod(jobj, minfo.methodID);
		}
	}
	                                           
#endif
    
    
    return true;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

FunctionTester.java

package com.chen;

public class FunctionTester {
	
	// 在调用非静态方法的时候,需要获得方法属于哪一个对象,所以必须有一个静态的实例。
	// 而且,这个实例没有办法直接访问,所以必须定义一个静态方法来获得这个实例
	// 这个实例必须以Object类型进行输出
	public static FunctionTester tester = null;
	public static Object getInstance(){
		if (tester == null){
			tester = new FunctionTester();
		}
		return tester;
	}

	/
	// #1 : 静态,无参数,无返回值
	// #2 : 静态,有参数,无返回值
	// #3 : 静态,有参数,有返回值
	// #4 : 非静态,无参数,无返回值
	// #5 : 非静态,有参数,无返回值
	// #6 : 非静态,有参数,有返回值
	/
	
	// #1
	public static void TF_S_NP_NR(){
		System.out.println("CALLED: TF_S_NP_NR"); 
	}
	
	// #2
	public static void TF_S_HP_NR(int _para){
		System.out.println("CALLED: TF_S_HP_NR, PARA: " + _para);
	}
	
	// #3
	public static int TF_S_HP_HR(int _para){
		System.out.println("CALLED: TF_S_HP_HR, PARA: " + _para);
		return 0;
	}
	
	// #4
	public void TF_US_NP_NR(){
		System.out.println("CALLED: TF_US_NP_NR");
	}
	
	// #5
	public void TF_US_HP_NR(int _para){
		System.out.println("CALLED: TF_US_HP_NR, PARA: " + _para);
	}
	
	// #6
	public int TF_US_HP_HR(int _para){
		System.out.println("CALLED: TF_US_HP_HR, PARA: " + _para);
		return 0;
	}
}




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值