Di Wu
Di Wu

Reputation: 6448

Code Won't Compile With Android NDK

Cocos2d-x is a C++ port of Cocos2d-for-iPhone. It has the advantage of cross-platform. I'm using Cocos2d-x to develop games for Android and iPhone.

Right now I'm compiling a set of Cocos2d-X code with both Android NDK and Xcode.

On Xcode the game compiles and runs well on the iPhone.

With Android NDK, the compile would fail. (I'm using the official Android r7c NDK).

Please help.

enter image description here

Edited: For those of you who're interested in the full implementation file. Here it is.

#include "GameOverScene.h"
#include "HelloWorldScene.h"

using namespace cocos2d;

bool GameOverScene::init() {
    if (CCScene::init()) {
        this->_layer = GameOverLayer::node();
        this->_layer->retain();
        this->addChild(_layer);

        return true;
    } else {
        return false;
    }
}

GameOverScene::~GameOverScene () {
    if (_layer) {
        _layer->release();
        _layer = NULL;
    }
}

bool GameOverLayer::init () {
    if (CCLayerColor::initWithColor(ccc4f(255, 255, 255, 255))) {
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        this->_label = CCLabelTTF::labelWithString("", "Artial", 32);
        _label->retain();
        _label->setColor(ccc3(0, 0, 0));
        _label->setPosition(ccp(winSize.width/2, winSize.height/2));
        this->addChild(_label);

        this->runAction(CCSequence::actions(CCDelayTime::actionWithDuration(3), CCCallFunc::actionWithTarget(this, callfunc_selector(GameOverLayer::gameOverDone)), NULL));

        return true;
    } else {
        return false;
    }
}

void GameOverLayer::gameOverDone() {
    CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}

GameOverLayer::~GameOverLayer() {
    if (_label) {
        _label->release();
        _label = NULL;
    }
}

And the full header file

#ifndef S6_GameOverScene_h
#define S6_GameOverScene_h

#include "cocos2d.h"

class GameOverLayer : public cocos2d::CCLayerColor {

public:
    GameOverLayer():_label(NULL) {};
    virtual ~GameOverLayer();
    bool init();
    LAYER_NODE_FUNC(GameOverLayer);

    void gameOverDone();

    CC_SYNTHESIZE_READONLY(cocos2d::CCLabelTTF*, _label, Label);

};

class GameOverScene : public cocos2d::CCScene {

public:
    GameOverScene():_layer(NULL) {};
    ~GameOverScene();
    bool init();

    //SCENE_NODE_FUNC(GameOverScene);

    static GameOverScene* node()
    {
        GameOverScene *pRet = new GameOverScene();

        //Error: undefined reference to `GameOverScene::init()'
        if (pRet && pRet->init())
        {
            pRet->autorelease();
            return pRet;
        }
        else
        {
            //Error: undefined reference to `vtable for GameOverScene'
            delete pRet;

            pRet = NULL;
            return NULL;
        }
    }; 

    CC_SYNTHESIZE_READONLY(GameOverLayer*, _layer, Layer);
};


#endif

Upvotes: 0

Views: 2494

Answers (3)

m.ding
m.ding

Reputation: 3182

You might forget to add GameOverScene.cpp in Android.mk located at Classed folder.

Upvotes: 1

Nikhil Aneja
Nikhil Aneja

Reputation: 1259

It might be problem with Android.mk file.. In that you need to add your GameOverScene.h file for compilation..

Upvotes: 1

Sebastian Mach
Sebastian Mach

Reputation: 39089

/Users/my_account_name/Desktop/Projects/S6/S6/android/jni/../../Classes/GameOver‌​Scene.h:40: undefined reference to GameOverScene::init()'

You have to link with GameOverScene's object file.

Upvotes: 1

Related Questions