2013-12-10 78 views
0

我是使用Cocos2d-X的新手,并且只是在应用程序中使用JNI进行实验。因此,这里是我的Java代码Android Cocos2dX JNI Bridge

public class JNITest { 
    public static native void printSomething(); 

    public static void printSomethingFromJava(){  
     printSomething(); 
    } 

} 

我用JAVAH生成一个头文件,并在我的MyScene.cpp文件执行打印

void notify(){ 
    CCNotificationCenter::sharedNotificationCenter()->postNotification("hello",NULL); 
} 

extern "C" { 
    void Java_com_nbs_test_JNITest_printSomething(JNIEnv *, jclass){ 
     CCLog("THE jni call is successfull"); 
     notify(); 
    } 
} 

的CCLOG消息的C函数,因此我的Android - > C++桥正在工作。在 MyScene.cpp的构造函数中我设置了一个监听

MyScene::MyScene() { 

    if (!CCLayer::init()) { 
     return; 
    } 
    CCNotificationCenter::sharedNotificationCenter()->addObserver(
         this, 
         callfuncO_selector(MyScene::printSomethingInCpp), 
         "hello", 
         NULL); 

,并在MyScene :: printSomethingInCpp我刚打印PingoScreen :: printSomethingInCpp这

void MyScene::printSomethingInCpp(){ 
    CCLog("Its goton hererew---------------------------->"); 
} 

日志信息从不打印。我不知道问题出在我的JNI调用还是观察者模式?

comeplete代码

#ifndef PINGOSCREEN_H_ 
#define PINGOSCREEN_H_ 
#include "RequestHandler.h" 
#include "cocos2d.h" 
#include "cocos-ext.h" 
#include "box2d.h" 
#include "json.h" 
#include "GLES-Render.h" 

#define MY_SCREEN_RES "hello" 
class PingoScreen: public cocos2d::CCLayer{ 
public: 
    bool init(); 
     PingoScreen(); 
     ~PingoScreen(); 
     static cocos2d::CCScene* scene(); 
     CREATE_FUNC(PingoScreen); 
     void printSomethingInCpp(CCObject *pObject); 
     static void notify(); 
     static PingoScreen* getInstance(); 

     void setListener(); 
private: 
     cocos2d::CCSprite *ball; 
     RequestHandler* r; 

}; 

AND

#include "PingoScreen.h" 
#include "SampleRequest.h" 
#include "platform/android/jni/JniHelper.h" 


#define PTM_RATIO 32; 
using namespace cocos2d; 
static PingoScreen* _mInstance = NULL; 

CCScene* PingoScreen::scene() { 
    CCScene* pScene = CCScene::create(); 
    PingoScreen* pingoScreen =PingoScreen::create(); 
    pScene->addChild(pingoScreen); 
    return pScene; 
} 



PingoScreen* PingoScreen::getInstance(){ 
    if(!_mInstance){ 
     _mInstance=PingoScreen::create(); 
    } 
    return _mInstance; 
} 




void PingoScreen::setListener(){ 
} 


bool PingoScreen::init(){ 
    if (!CCLayer::init()) { 
      return false; 
    } 

     // CCNotificationCenter::sharedNotificationCenter()->postNotification("hello",NULL); 
    CCNotificationCenter::sharedNotificationCenter()->addObserver(
       this, 
       callfuncO_selector(PingoScreen::printSomethingInCpp), 
       "hello", 
       NULL); 

     CCSize pSize = CCDirector::sharedDirector()->getWinSize(); 
     CCSprite* backgroundSprite = CCSprite::create("room5.png"); 
     backgroundSprite->setAnchorPoint(CCPointZero); 
     this->addChild(backgroundSprite, -1); 
     return true; 
} 
PingoScreen::PingoScreen() { 


} 

PingoScreen::~PingoScreen() { 

} 


void PingoScreen::printSomethingInCpp(CCObject *pObject){ 
    CCLog("Its goton hererew [email protected]@@@@@@@@@@@@@@[email protected]@@@@@@@@@@@@@@------------------>"); 
} 

void PingoScreen::notify(){ 
    CCNotificationCenter::sharedNotificationCenter()->postNotification("hello",NULL); 
} 

extern "C" { 
    void Java_com_nbs_test_JNITest_printSomething(JNIEnv *, jclass){ 
     PingoScreen::notify(); 
    } 
} 

回答

0

callfuncO_selector取方法的函数指针,它接受CCObject*作为参数。

你的方法MyScene::printSomethingInCpp()应该是这样的:

MyScene::printSomethingInCpp(CCObject* pSender) 
{ 
    // your code 
} 
+0

我已经做了仍然没有工作。 – AndroidDev

+0

如果我将帖子通知调用移动到Cocos2d-X代码中的任何地方,它可以正常工作。从C代码生成的通知没有找到任何观察者? – AndroidDev

+0

用完整的代码编辑我的问题。 – AndroidDev