【问题标题】:Code Won't Compile With Android NDK代码无法使用 Android NDK 编译
【发布时间】:2012-04-23 15:17:09
【问题描述】:

Cocos2d-x 是 Cocos2d-for-iPhone 的 C++ 端口。它具有跨平台的优势。我正在使用 Cocos2d-x 为 Android 和 iPhone 开发游戏。

现在我正在用 Android NDK 和 Xcode 编译一组 Cocos2d-X 代码。

在 Xcode 上,游戏在 iPhone 上编译和运行良好。

使用 Android NDK,编译会失败。 (我使用的是官方的 Android r7c NDK)。

请帮忙。

已编辑:对于那些对完整实现文件感兴趣的人。在这里。

#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;
    }
}

还有完整的头文件

#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

【问题讨论】:

  • 你不是在几分钟前问过这个吗?这些方法的实现在哪里?
  • 尝试发布编译器错误,而不仅仅是出现错误。
  • @Mat 我刚刚添加了实现文件。提前致谢!
  • @Kevin 在截图中有错误描述。这是一个完整的:./obj/local/armeabi/objs/game_shared/__/__/Classes/HelloWorldScene.o:在函数GameOverScene::node()': /Users/my_account_name/Desktop/Projects/S6/S6/android/jni/../../Classes/GameOverScene.h:40: undefined reference to GameOverScene::init()'
  • @diwup:我在截图中没有看到错误,请不要截图来显示代码。

标签: c++ android-ndk cocos2d-x


【解决方案1】:

Android.mk 文件可能有问题。你需要添加 GameOverScene.h 文件进行编译。

【讨论】:

    【解决方案2】:

    /Users/my_account_name/Desktop/Projects/S6/S6/android/jni/../../Classes/GameOver‌​Scene.h:40:未定义对 GameOverScene::init()' 的引用

    你必须链接GameOverScene的目标文件。

    【讨论】:

      【解决方案3】:

      您可能忘记在 Classed 文件夹下的 Android.mk 中添加 GameOverScene.cpp。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多