mirror of https://github.com/axmolengine/axmol.git
Adding CocosPlayerJS for Android
This commit is contained in:
parent
be305f84b6
commit
43229cb440
|
@ -0,0 +1,152 @@
|
||||||
|
#include "AppDelegate.h"
|
||||||
|
#include "PlayerStatus.h"
|
||||||
|
#include "cocos2d.h"
|
||||||
|
#include "SimpleAudioEngine.h"
|
||||||
|
#include "ScriptingCore.h"
|
||||||
|
#include "generated/cocos2dx.hpp"
|
||||||
|
#include "cocos2d_specifics.hpp"
|
||||||
|
#include "js_bindings_chipmunk_registration.h"
|
||||||
|
#include "js_bindings_ccbreader.h"
|
||||||
|
#include "MainSceneHelper.h"
|
||||||
|
|
||||||
|
#ifdef JSLOG
|
||||||
|
#undef JSLOG
|
||||||
|
#endif
|
||||||
|
#define JSLOG CocosBuilder_log
|
||||||
|
|
||||||
|
char *_js_log_buf_ccbuilder = NULL;
|
||||||
|
|
||||||
|
USING_NS_CC;
|
||||||
|
using namespace CocosDenshion;
|
||||||
|
|
||||||
|
AppDelegate::AppDelegate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
AppDelegate::~AppDelegate()
|
||||||
|
{
|
||||||
|
CCScriptEngineManager::sharedManager()->purgeSharedManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_ccb_run() {
|
||||||
|
ScriptingCore::getInstance()->runScript("main.js");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_connected() {
|
||||||
|
CCBHelper::setStatusMessage("Connected!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_disconnected() {
|
||||||
|
CCBHelper::setStatusMessage("Disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_ccb_stop() {
|
||||||
|
CCLOG("STOP UNIMPLEMENTED");
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
bool runMainScene() {
|
||||||
|
PlayerStatus::loadMainScene("StatusLayer.ccbi");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppDelegate::applicationDidFinishLaunching()
|
||||||
|
{
|
||||||
|
|
||||||
|
// initialize director
|
||||||
|
CCDirector *pDirector = CCDirector::sharedDirector();
|
||||||
|
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
|
||||||
|
pDirector->setProjection(kCCDirectorProjection2D);
|
||||||
|
|
||||||
|
|
||||||
|
CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();
|
||||||
|
|
||||||
|
CCSize designSize = CCSizeMake(320, 480);
|
||||||
|
CCSize resourceSize = CCSizeMake(320, 480);
|
||||||
|
|
||||||
|
|
||||||
|
if (screenSize.height > 1024)
|
||||||
|
{
|
||||||
|
resourceSize = CCSizeMake(1280, 1920);
|
||||||
|
CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(CCArray::create(CCString::create("resources-xlarge"), CCString::create(""), NULL));
|
||||||
|
}
|
||||||
|
else if (screenSize.height > 960)
|
||||||
|
{
|
||||||
|
resourceSize = CCSizeMake(640, 960);
|
||||||
|
CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(CCArray::create(CCString::create("resources-large"), CCString::create(""), NULL));
|
||||||
|
}
|
||||||
|
else if (screenSize.height > 480)
|
||||||
|
{
|
||||||
|
resourceSize = CCSizeMake(480, 720);
|
||||||
|
CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(CCArray::create(CCString::create("resources-medium"), CCString::create(""), NULL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resourceSize = CCSizeMake(320, 568);
|
||||||
|
CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(CCArray::create(CCString::create("resources-small"), CCString::create(""), NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
pDirector->setContentScaleFactor(resourceSize.height/designSize.height);
|
||||||
|
|
||||||
|
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);
|
||||||
|
|
||||||
|
CCFileUtils::sharedFileUtils()->setSearchPath(CCArray::create(CCString::create(CCFileUtils::sharedFileUtils()->getWriteablePath()),
|
||||||
|
CCString::create("assets/"), CCString::create(""), NULL));
|
||||||
|
// turn on display FPS
|
||||||
|
pDirector->setDisplayStats(true);
|
||||||
|
|
||||||
|
// set FPS. the default value is 1.0/60 if you don't call this
|
||||||
|
pDirector->setAnimationInterval(1.0 / 60);
|
||||||
|
|
||||||
|
ScriptingCore* sc = ScriptingCore::getInstance();
|
||||||
|
sc->addRegisterCallback(register_all_cocos2dx);
|
||||||
|
sc->addRegisterCallback(register_cocos2dx_js_extensions);
|
||||||
|
sc->addRegisterCallback(register_CCBuilderReader);
|
||||||
|
sc->addRegisterCallback(jsb_register_chipmunk);
|
||||||
|
|
||||||
|
sc->start();
|
||||||
|
CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance();
|
||||||
|
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
|
||||||
|
runMainScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void handle_signal(int signal) {
|
||||||
|
static int internal_state = 0;
|
||||||
|
ScriptingCore* sc = ScriptingCore::getInstance();
|
||||||
|
// should start everything back
|
||||||
|
CCDirector* director = CCDirector::sharedDirector();
|
||||||
|
if (director->getRunningScene()) {
|
||||||
|
director->popToRootScene();
|
||||||
|
} else {
|
||||||
|
CCPoolManager::sharedPoolManager()->finalize();
|
||||||
|
if (internal_state == 0) {
|
||||||
|
//sc->dumpRoot(NULL, 0, NULL);
|
||||||
|
sc->start();
|
||||||
|
internal_state = 1;
|
||||||
|
} else {
|
||||||
|
sc->runScript("hello.js");
|
||||||
|
internal_state = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
|
||||||
|
void AppDelegate::applicationDidEnterBackground()
|
||||||
|
{
|
||||||
|
CCDirector::sharedDirector()->stopAnimation();
|
||||||
|
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
|
||||||
|
SimpleAudioEngine::sharedEngine()->pauseAllEffects();
|
||||||
|
}
|
||||||
|
|
||||||
|
// this function will be called when the app is active again
|
||||||
|
void AppDelegate::applicationWillEnterForeground()
|
||||||
|
{
|
||||||
|
CCDirector::sharedDirector()->startAnimation();
|
||||||
|
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
|
||||||
|
SimpleAudioEngine::sharedEngine()->resumeAllEffects();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
//
|
||||||
|
// GCTestAppDelegate.h
|
||||||
|
// GCTest
|
||||||
|
//
|
||||||
|
// Created by Rohan Kuruvilla on 06/08/2012.
|
||||||
|
// Copyright __MyCompanyName__ 2012. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef _APP_DELEGATE_H_
|
||||||
|
#define _APP_DELEGATE_H_
|
||||||
|
|
||||||
|
#include "CCApplication.h"
|
||||||
|
/**
|
||||||
|
@brief The cocos2d Application.
|
||||||
|
|
||||||
|
The reason for implement as private inheritance is to hide some interface call by CCDirector.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class AppDelegate : private cocos2d::CCApplication
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AppDelegate();
|
||||||
|
virtual ~AppDelegate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Implement CCDirector and CCScene init code here.
|
||||||
|
@return true Initialize success, app continue.
|
||||||
|
@return false Initialize failed, app terminate.
|
||||||
|
*/
|
||||||
|
virtual bool applicationDidFinishLaunching();
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief The function be called when the application enter background
|
||||||
|
@param the pointer of the application
|
||||||
|
*/
|
||||||
|
virtual void applicationDidEnterBackground();
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief The function be called when the application enter foreground
|
||||||
|
@param the pointer of the application
|
||||||
|
*/
|
||||||
|
virtual void applicationWillEnterForeground();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void handle_ccb_run();
|
||||||
|
void handle_ccb_stop();
|
||||||
|
void handle_connected();
|
||||||
|
void handle_disconnected();
|
||||||
|
#endif // _APP_DELEGATE_H_
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <jni.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
#include <string>
|
||||||
|
#include "platform/android/jni/JniHelper.h"
|
||||||
|
#include "cocoa/CCString.h"
|
||||||
|
#include "Java_org_cocos2dx_cocosplayer_CocosPlayerSocket.h"
|
||||||
|
|
||||||
|
#define LOG_TAG "Java_org_cocos2dx_cocosplayer_CocosPlayerSocket.cpp"
|
||||||
|
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
|
||||||
|
|
||||||
|
#define SOCKET_CLASS_NAME "org/cocos2dx/cocosplayer/CocosPlayerSocket"
|
||||||
|
#define HELPER_CLASS_NAME "org/cocos2dx/cocosplayer/CCBFileUtilsHelper"
|
||||||
|
|
||||||
|
using namespace cocos2d;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void setPairingCodeJNI(int code) {
|
||||||
|
JniMethodInfo t;
|
||||||
|
if (JniHelper::getStaticMethodInfo(t, SOCKET_CLASS_NAME, "setPairingCode", "(I)V")) {
|
||||||
|
t.env->CallStaticVoidMethod(t.classID, t.methodID, code);
|
||||||
|
t.env->DeleteLocalRef(t.classID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanCacheDirJNI() {
|
||||||
|
JniMethodInfo t;
|
||||||
|
if (JniHelper::getStaticMethodInfo(t, HELPER_CLASS_NAME, "cleanCache", "()V")) {
|
||||||
|
t.env->CallStaticVoidMethod(t.classID, t.methodID);
|
||||||
|
t.env->DeleteLocalRef(t.classID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2010 cocos2d-x.org
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_H__
|
||||||
|
#define __Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_H__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern void setPairingCodeJNI(int code);
|
||||||
|
extern void cleanCacheDirJNI();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,87 @@
|
||||||
|
#include "MainSceneHelper.h"
|
||||||
|
|
||||||
|
CCMenuItemImage * CCBHelper::mBtnRun = NULL;
|
||||||
|
CCMenuItemImage * CCBHelper::mBtnPair = NULL;
|
||||||
|
CCMenuItemImage * CCBHelper::mBtnReset = NULL;
|
||||||
|
|
||||||
|
CCLabelTTF * CCBHelper::mLblStatus = NULL;
|
||||||
|
CCLabelTTF * CCBHelper::mLblPair = NULL;
|
||||||
|
CCLabelTTF * CCBHelper::mLblInstructions = NULL;
|
||||||
|
|
||||||
|
std::string CCBHelper::mLblStatus_background = "";
|
||||||
|
std::string CCBHelper::mLblPair_background = "";
|
||||||
|
bool CCBHelper::mLblInstructions_visible = true;
|
||||||
|
|
||||||
|
|
||||||
|
void CCBHelper::setStatusObject(CCLabelTTF *status) {
|
||||||
|
if(mLblStatus == NULL) {
|
||||||
|
mLblStatus = CCLabelTTF::create();
|
||||||
|
}
|
||||||
|
|
||||||
|
status->retain();
|
||||||
|
mLblStatus = status;
|
||||||
|
|
||||||
|
if(mLblStatus_background != "") {
|
||||||
|
status->setString(mLblStatus_background.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CCBHelper::setStatusMessage(std::string str) {
|
||||||
|
if(mLblStatus == NULL) {
|
||||||
|
mLblStatus_background = str;
|
||||||
|
} else {
|
||||||
|
mLblStatus->setString(str.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCBHelper::setInstructionsObject(CCLabelTTF *status) {
|
||||||
|
if(mLblInstructions == NULL) {
|
||||||
|
mLblInstructions = CCLabelTTF::create();
|
||||||
|
}
|
||||||
|
status->retain();
|
||||||
|
mLblInstructions = status;
|
||||||
|
if(!mLblInstructions_visible) {
|
||||||
|
mLblInstructions->setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCBHelper::setInstructionsMessage(bool isVisible) {
|
||||||
|
if(mLblInstructions == NULL) {
|
||||||
|
mLblInstructions_visible = isVisible;
|
||||||
|
} else {
|
||||||
|
mLblInstructions_visible = isVisible;
|
||||||
|
mLblInstructions->setVisible(isVisible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCBHelper::setPairObject(CCLabelTTF *pair) {
|
||||||
|
|
||||||
|
if(mLblPair == NULL) {
|
||||||
|
mLblPair = CCLabelTTF::create();
|
||||||
|
}
|
||||||
|
pair->retain();
|
||||||
|
mLblPair = pair;
|
||||||
|
if(mLblPair_background != "") {
|
||||||
|
mLblPair->setString(mLblPair_background.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCBHelper::setPairMessage(std::string str) {
|
||||||
|
if(mLblPair == NULL) {
|
||||||
|
mLblPair_background = str;
|
||||||
|
} else {
|
||||||
|
mLblPair->setString(str.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCBHelper::isMainJSPresent() {
|
||||||
|
std::string path = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("main.js");
|
||||||
|
CCLOG("PATH RETURNED: %s", path.c_str());
|
||||||
|
if(path == "") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include "cocos2d.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
USING_NS_CC;
|
||||||
|
|
||||||
|
class CCBHelper {
|
||||||
|
public:
|
||||||
|
static CCMenuItemImage * mBtnRun;
|
||||||
|
static CCMenuItemImage * mBtnReset;
|
||||||
|
static CCMenuItemImage * mBtnPair;
|
||||||
|
|
||||||
|
static CCLabelTTF *mLblStatus;
|
||||||
|
static std::string mLblStatus_background;
|
||||||
|
static CCLabelTTF *mLblPair;
|
||||||
|
static std::string mLblPair_background;
|
||||||
|
static CCLabelTTF *mLblInstructions;
|
||||||
|
static bool mLblInstructions_visible;
|
||||||
|
|
||||||
|
static void setPairObject(CCLabelTTF *pair);
|
||||||
|
static void setPairMessage(std::string str);
|
||||||
|
|
||||||
|
static void setInstructionsObject(CCLabelTTF *instr);
|
||||||
|
static void setInstructionsMessage(bool isVisible);
|
||||||
|
|
||||||
|
static void setStatusObject(CCLabelTTF *status);
|
||||||
|
static void setStatusMessage(std::string str);
|
||||||
|
|
||||||
|
static bool isMainJSPresent();
|
||||||
|
};
|
|
@ -0,0 +1,156 @@
|
||||||
|
|
||||||
|
#include "PlayerStatus.h"
|
||||||
|
#include "PlayerStatusLoader.h"
|
||||||
|
#include "MainSceneHelper.h"
|
||||||
|
#include "AppDelegate.h"
|
||||||
|
#include "GUI/CCEditBox/CCEditBox.h"
|
||||||
|
#include "jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"
|
||||||
|
|
||||||
|
|
||||||
|
USING_NS_CC;
|
||||||
|
USING_NS_CC_EXT;
|
||||||
|
|
||||||
|
PlayerStatus::PlayerStatus(): mBtnRun(NULL), mBtnReset(NULL), mBtnPair(NULL),
|
||||||
|
mLblStatus(NULL), mLblInstructions(NULL), mLblPair(NULL)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerStatus::~PlayerStatus()
|
||||||
|
{
|
||||||
|
CC_SAFE_RELEASE(mBtnRun);
|
||||||
|
CC_SAFE_RELEASE(mBtnReset);
|
||||||
|
CC_SAFE_RELEASE(mBtnPair);
|
||||||
|
|
||||||
|
CC_SAFE_RELEASE(mLblStatus);
|
||||||
|
CC_SAFE_RELEASE(mLblPair);
|
||||||
|
CC_SAFE_RELEASE(mLblInstructions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PlayerStatus::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SEL_CCControlHandler PlayerStatus::onResolveCCBCCControlSelector(CCObject * pTarget, const char * pSelectorName) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEL_MenuHandler PlayerStatus::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char * pSelectorName) {
|
||||||
|
|
||||||
|
CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "pressedPair:", PlayerStatus::pressedPair);
|
||||||
|
CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "pressedReset:", PlayerStatus::pressedReset);
|
||||||
|
CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "pressedRun:", PlayerStatus::pressedRun);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void editBoxCallbackFunc(const char* pText, void* ctx)
|
||||||
|
{
|
||||||
|
PlayerStatus *thiz = (PlayerStatus *)ctx;
|
||||||
|
std::string text(pText);
|
||||||
|
if(text == "" || text == " ") {
|
||||||
|
thiz->mLblPair->setString("Auto");
|
||||||
|
setPairingCodeJNI(-1);
|
||||||
|
} else {
|
||||||
|
thiz->mLblPair->setString(pText);
|
||||||
|
setPairingCodeJNI(atoi(pText));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerStatus::pressedPair(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {
|
||||||
|
showEditTextDialogJNI("Enter pairing code", "", kEditBoxInputModeNumeric, kEditBoxInputFlagInitialCapsWord,
|
||||||
|
kKeyboardReturnTypeDone, 4, editBoxCallbackFunc, (void*)this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerStatus::pressedReset(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {
|
||||||
|
cleanCacheDirJNI();
|
||||||
|
this->mBtnRun->setEnabled(false);
|
||||||
|
this->mBtnReset->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PlayerStatus::pressedRun(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {
|
||||||
|
handle_ccb_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PlayerStatus::onAssignCCBMemberVariable(CCObject * pTarget, const char * pMemberVariableName, CCNode * pNode) {
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "btnRun", CCMenuItemImage *, this->mBtnRun);
|
||||||
|
if(strcmp(pMemberVariableName, "btnRun")) {
|
||||||
|
if(this->mBtnRun == NULL) {
|
||||||
|
this->mBtnRun = CCMenuItemImage::create();
|
||||||
|
}
|
||||||
|
if(CCBHelper::isMainJSPresent()) {
|
||||||
|
this->mBtnRun->setEnabled(true);
|
||||||
|
} else {
|
||||||
|
this->mBtnRun->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "btnReset", CCMenuItemImage *, this->mBtnReset);
|
||||||
|
|
||||||
|
if(strcmp(pMemberVariableName, "btnReset")) {
|
||||||
|
if(this->mBtnReset == NULL) {
|
||||||
|
this->mBtnReset = CCMenuItemImage::create();
|
||||||
|
}
|
||||||
|
if(CCBHelper::isMainJSPresent()) {
|
||||||
|
this->mBtnReset->setEnabled(true);
|
||||||
|
} else {
|
||||||
|
this->mBtnReset->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "btnPair", CCMenuItemImage *, this->mBtnPair);
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "lblStatus", CCLabelTTF *, this->mLblStatus);
|
||||||
|
if(strcmp(pMemberVariableName, "lblStatus") && this->mLblStatus != NULL) {
|
||||||
|
CCBHelper::setStatusObject(this->mLblStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "lblPair", CCLabelTTF *, this->mLblPair);
|
||||||
|
if(strcmp(pMemberVariableName, "lblPair") && this->mLblPair != NULL) {
|
||||||
|
CCBHelper::setPairObject(this->mLblPair);
|
||||||
|
}
|
||||||
|
|
||||||
|
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "lblInstructions", CCLabelTTF *, this->mLblInstructions);
|
||||||
|
if(strcmp(pMemberVariableName, "lblInstructions") && this->mLblInstructions != NULL) {
|
||||||
|
CCBHelper::setInstructionsObject(this->mLblInstructions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PlayerStatus::loadMainScene(const char *pCCBFileName) {
|
||||||
|
CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
|
||||||
|
|
||||||
|
ccNodeLoaderLibrary->registerCCNodeLoader("PlayerStatusLayer", PlayerStatusLoader::loader());
|
||||||
|
|
||||||
|
/* Create an autorelease CCBReader. */
|
||||||
|
cocos2d::extension::CCBReader * ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);
|
||||||
|
ccbReader->autorelease();
|
||||||
|
|
||||||
|
/* Read a ccbi file. */
|
||||||
|
// Load the scene from the ccbi-file, setting this class as
|
||||||
|
// the owner will cause lblTestTitle to be set by the CCBReader.
|
||||||
|
// lblTestTitle is in the TestHeader.ccbi, which is referenced
|
||||||
|
// from each of the test scenes.
|
||||||
|
CCNode * node = ccbReader->readNodeGraphFromFile(pCCBFileName, NULL);
|
||||||
|
|
||||||
|
CCScene * scene = CCScene::create();
|
||||||
|
if(node != NULL) {
|
||||||
|
scene->addChild(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Push the new scene with a fancy transition. */
|
||||||
|
ccColor3B transitionColor;
|
||||||
|
transitionColor.r = 0;
|
||||||
|
transitionColor.g = 0;
|
||||||
|
transitionColor.b = 0;
|
||||||
|
|
||||||
|
CCDirector::sharedDirector()->runWithScene(CCTransitionFade::create(0.5f, scene, transitionColor));
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef _PLAYERSTATUS_H_
|
||||||
|
#define _PLAYERSTATUS_H_
|
||||||
|
|
||||||
|
#include "cocos2d.h"
|
||||||
|
#include "cocos-ext.h"
|
||||||
|
|
||||||
|
#include "Java_org_cocos2dx_cocosplayer_CocosPlayerSocket.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: for some pretty hard fucked up reason, the order of inheritance is important!
|
||||||
|
* When CCLayer is the 'first' inherited object:
|
||||||
|
* During runtime the method call to the (pure virtual) 'interfaces' fails jumping into a bogus method or just doing nothing:
|
||||||
|
* #0 0x000cf840 in non-virtual thunk to HelloCocos....
|
||||||
|
* #1 ....
|
||||||
|
*
|
||||||
|
* This thread describes the problem:
|
||||||
|
* http://www.cocoabuilder.com/archive/xcode/265549-crash-in-virtual-method-call.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class PlayerStatus
|
||||||
|
: public cocos2d::CCLayer
|
||||||
|
, public cocos2d::extension::CCBSelectorResolver
|
||||||
|
, public cocos2d::extension::CCBMemberVariableAssigner
|
||||||
|
, public cocos2d::extension::CCNodeLoaderListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(PlayerStatus, create);
|
||||||
|
|
||||||
|
PlayerStatus();
|
||||||
|
virtual ~PlayerStatus();
|
||||||
|
|
||||||
|
void openTest(const char * pCCBFileName, const char * pCCNodeName = NULL, cocos2d::extension::CCNodeLoader * pCCNodeLoader = NULL);
|
||||||
|
|
||||||
|
virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, const char * pSelectorName);
|
||||||
|
virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, const char * pSelectorName);
|
||||||
|
virtual bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, const char * pMemberVariableName, cocos2d::CCNode * pNode);
|
||||||
|
virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader);
|
||||||
|
|
||||||
|
void pressedPair(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);
|
||||||
|
void pressedReset(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);
|
||||||
|
void pressedRun(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);
|
||||||
|
static void loadMainScene(const char *fileName);
|
||||||
|
|
||||||
|
cocos2d::CCMenuItemImage* mBtnRun;
|
||||||
|
cocos2d::CCMenuItemImage* mBtnReset;
|
||||||
|
cocos2d::CCMenuItemImage* mBtnPair;
|
||||||
|
|
||||||
|
cocos2d::CCLabelTTF* mLblStatus;
|
||||||
|
cocos2d::CCLabelTTF* mLblInstructions;
|
||||||
|
cocos2d::CCLabelTTF* mLblPair;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef _PLAYERSTATUSLOADER_H_
|
||||||
|
#define _PLAYERSTATUSLOADER_H_
|
||||||
|
|
||||||
|
#include "PlayerStatus.h"
|
||||||
|
|
||||||
|
/* Forward declaration. */
|
||||||
|
class CCBReader;
|
||||||
|
|
||||||
|
class PlayerStatusLoader : public cocos2d::extension::CCLayerLoader {
|
||||||
|
public:
|
||||||
|
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(PlayerStatusLoader, loader);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(PlayerStatus);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1 @@
|
||||||
|
349baa101ddbdf4edf6d20b17362bd22c0008284
|
|
@ -0,0 +1 @@
|
||||||
|
fe7e93e8e974f39426858d2bfbed7dff26c2b9c4
|
|
@ -0,0 +1 @@
|
||||||
|
20213456280fa1bced942496820fd71cb35ddb64
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="src" path="gen"/>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||||
|
<classpathentry kind="output" path="bin/classes"/>
|
||||||
|
</classpath>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>CocosDragonJS</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.cocos2dx.cocosplayer"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
|
||||||
|
<uses-sdk android:minSdkVersion="16"/>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
<application android:label="@string/app_name"
|
||||||
|
android:icon="@drawable/icon" android:largeHeap="true">
|
||||||
|
|
||||||
|
<service android:name=".CocosPlayerPresence" />
|
||||||
|
<service android:name=".CocosPlayerSocket" />
|
||||||
|
|
||||||
|
<activity android:name=".CocosPlayer"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
|
||||||
|
android:configChanges="orientation">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
<supports-screens android:largeScreens="true"
|
||||||
|
android:smallScreens="true"
|
||||||
|
android:anyDensity="true"
|
||||||
|
android:normalScreens="true"/>
|
||||||
|
</manifest>
|
|
@ -0,0 +1 @@
|
||||||
|
aapt.ignore.assets="!*.pvr.gz:!*.gz:!.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="CocosPlayer" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contains the path to the SDK. It should *NOT* be checked into
|
||||||
|
Version Control Systems. -->
|
||||||
|
<property file="local.properties" />
|
||||||
|
|
||||||
|
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||||
|
'android' tool to add properties to it.
|
||||||
|
This is the place to change some Ant specific build properties.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
source.dir
|
||||||
|
The name of the source directory. Default is 'src'.
|
||||||
|
out.dir
|
||||||
|
The name of the output directory. Default is 'bin'.
|
||||||
|
|
||||||
|
For other overridable properties, look at the beginning of the rules
|
||||||
|
files in the SDK, at tools/ant/build.xml
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should
|
||||||
|
be updated using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="ant.properties" />
|
||||||
|
|
||||||
|
<!-- if sdk.dir was not set from one of the property file, then
|
||||||
|
get it from the ANDROID_HOME env var.
|
||||||
|
This must be done before we load project.properties since
|
||||||
|
the proguard config can use sdk.dir -->
|
||||||
|
<property environment="env" />
|
||||||
|
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||||
|
<isset property="env.ANDROID_HOME" />
|
||||||
|
</condition>
|
||||||
|
|
||||||
|
<!-- The project.properties file is created and updated by the 'android'
|
||||||
|
tool, as well as ADT.
|
||||||
|
|
||||||
|
This contains project specific properties such as project target, and library
|
||||||
|
dependencies. Lower level build properties are stored in ant.properties
|
||||||
|
(or in .classpath for Eclipse projects).
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems. -->
|
||||||
|
<loadproperties srcFile="project.properties" />
|
||||||
|
|
||||||
|
<!-- quick check on sdk.dir -->
|
||||||
|
<fail
|
||||||
|
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||||
|
unless="sdk.dir"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Import per project custom build rules if present at the root of the project.
|
||||||
|
This is the place to put custom intermediary targets such as:
|
||||||
|
-pre-build
|
||||||
|
-pre-compile
|
||||||
|
-post-compile (This is typically used for code obfuscation.
|
||||||
|
Compiled code location: ${out.classes.absolute.dir}
|
||||||
|
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||||
|
-post-package
|
||||||
|
-post-build
|
||||||
|
-pre-clean
|
||||||
|
-->
|
||||||
|
<import file="custom_rules.xml" optional="true" />
|
||||||
|
|
||||||
|
<!-- Import the actual build file.
|
||||||
|
|
||||||
|
To customize existing targets, there are two options:
|
||||||
|
- Customize only one target:
|
||||||
|
- copy/paste the target into this file, *before* the
|
||||||
|
<import> task.
|
||||||
|
- customize it to your needs.
|
||||||
|
- Customize the whole content of build.xml
|
||||||
|
- copy/paste the content of the rules files (minus the top node)
|
||||||
|
into this file, replacing the <import> task.
|
||||||
|
- customize to your needs.
|
||||||
|
|
||||||
|
***********************
|
||||||
|
****** IMPORTANT ******
|
||||||
|
***********************
|
||||||
|
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||||
|
in order to avoid having your file be overridden by tools such as "android update project"
|
||||||
|
-->
|
||||||
|
<!-- version-tag: 1 -->
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,88 @@
|
||||||
|
#NDK_ROOT="/opt/android/android-ndk"
|
||||||
|
APPNAME="CocosPlayer"
|
||||||
|
|
||||||
|
# options
|
||||||
|
|
||||||
|
buildexternalsfromsource=
|
||||||
|
PARALLEL_BUILD_FLAG=
|
||||||
|
|
||||||
|
usage(){
|
||||||
|
cat << EOF
|
||||||
|
usage: $0 [options]
|
||||||
|
|
||||||
|
Build C/C++ code for $APPNAME using Android NDK
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-s Build externals from source
|
||||||
|
-p Run make with -j8 option to take advantage of multiple processors
|
||||||
|
-h this help
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts "sph" OPTION; do
|
||||||
|
case "$OPTION" in
|
||||||
|
s)
|
||||||
|
buildexternalsfromsource=1
|
||||||
|
;;
|
||||||
|
p)
|
||||||
|
PARALLEL_BUILD_FLAG=\-j8
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# exit this script if any commmand fails
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# paths
|
||||||
|
|
||||||
|
if [ -z "${NDK_ROOT+aaa}" ];then
|
||||||
|
echo "please define NDK_ROOT"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
# ... use paths relative to current directory
|
||||||
|
COCOS2DX_ROOT="$DIR/../../../../"
|
||||||
|
APP_ROOT="$DIR/.."
|
||||||
|
APP_ANDROID_ROOT="$DIR"
|
||||||
|
BINDINGS_JS_ROOT="$APP_ROOT/../../../scripting/javascript/bindings/js"
|
||||||
|
RESROUCE_ROOT="$APP_ROOT/Resources"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Paths"
|
||||||
|
echo " NDK_ROOT = $NDK_ROOT"
|
||||||
|
echo " COCOS2DX_ROOT = $COCOS2DX_ROOT"
|
||||||
|
echo " APP_ROOT = $APP_ROOT"
|
||||||
|
echo " APP_ANDROID_ROOT = $APP_ANDROID_ROOT"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Debug
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# make sure assets is exist
|
||||||
|
if [ -d "$APP_ANDROID_ROOT"/assets ]; then
|
||||||
|
rm -rf "$APP_ANDROID_ROOT"/assets
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir "$APP_ANDROID_ROOT"/assets
|
||||||
|
|
||||||
|
# copy bindings/*.js into assets' root
|
||||||
|
cp -f "$BINDINGS_JS_ROOT"/*.js "$APP_ANDROID_ROOT"/assets
|
||||||
|
|
||||||
|
# copy bindings/*.js into assets' root
|
||||||
|
cp -rf "$RESROUCE_ROOT"/ "$APP_ANDROID_ROOT"/assets
|
||||||
|
|
||||||
|
#cp -rf "$CCB_RESOURCE_ROOT" "$APP_ANDROID_ROOT"/assets
|
||||||
|
|
||||||
|
echo "Using prebuilt externals"
|
||||||
|
echo
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
"$NDK_ROOT"/ndk-build $PARALLEL_BUILD_FLAG -C "$APP_ANDROID_ROOT" $* \
|
||||||
|
"NDK_MODULE_PATH=${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/prebuilt" \
|
||||||
|
NDK_LOG=0 V=0
|
|
@ -0,0 +1,32 @@
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE := cocosplayer_shared
|
||||||
|
|
||||||
|
LOCAL_MODULE_FILENAME := libcocosplayer
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := cocosplayer/main.cpp \
|
||||||
|
../../Classes/PlayerStatus.cpp\
|
||||||
|
../../Classes/AppDelegate.cpp \
|
||||||
|
../../Classes/MainSceneHelper.cpp \
|
||||||
|
../../Classes/Java_org_cocos2dx_cocosplayer_CocosPlayerSocket.cpp
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
|
||||||
|
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES += spidermonkey_static
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES += scriptingcore-spidermonkey
|
||||||
|
|
||||||
|
LOCAL_EXPORT_CFLAGS := -DCOCOS2D_DEBUG=2 -DCOCOS2D_JAVASCRIPT
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
$(call import-module,cocos2dx)
|
||||||
|
$(call import-module,CocosDenshion/android)
|
||||||
|
$(call import-module,external/chipmunk)
|
||||||
|
$(call import-module,scripting/javascript/spidermonkey-android)
|
||||||
|
$(call import-module,scripting/javascript/bindings)
|
|
@ -0,0 +1,3 @@
|
||||||
|
APP_STL := gnustl_static
|
||||||
|
APP_CPPFLAGS := -frtti -DCOCOS2D_JAVASCRIPT=1
|
||||||
|
APP_CPPFLAGS += -DCOCOS2D_DEBUG=1 -DCC_ENABLE_CHIPMUNK_INTEGRATION=1
|
|
@ -0,0 +1,79 @@
|
||||||
|
#include "AppDelegate.h"
|
||||||
|
#include "PlayerStatus.h"
|
||||||
|
#include "cocos2d.h"
|
||||||
|
#include "platform/android/jni/JniHelper.h"
|
||||||
|
#include "CCEventType.h"
|
||||||
|
#include <jni.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
|
||||||
|
#define LOG_TAG "main"
|
||||||
|
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
|
||||||
|
|
||||||
|
using namespace cocos2d;
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
|
||||||
|
jint JNI_OnLoad(JavaVM *vm, void *reserved)
|
||||||
|
{
|
||||||
|
JniHelper::setJavaVM(vm);
|
||||||
|
|
||||||
|
return JNI_VERSION_1_4;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
|
||||||
|
{
|
||||||
|
if (!CCDirector::sharedDirector()->getOpenGLView())
|
||||||
|
{
|
||||||
|
CCEGLView *view = CCEGLView::sharedOpenGLView();
|
||||||
|
view->setFrameSize(w, h);
|
||||||
|
|
||||||
|
AppDelegate *pAppDelegate = new AppDelegate();
|
||||||
|
CCApplication::sharedApplication()->run();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ccDrawInit();
|
||||||
|
ccGLInvalidateStateCache();
|
||||||
|
|
||||||
|
CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
|
||||||
|
CCTextureCache::reloadAllTextures();
|
||||||
|
CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL);
|
||||||
|
CCDirector::sharedDirector()->setGLDefaultValues();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_lib_Cocos2dxGLSurfaceView_nativeRunCCB(JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
LOGD("INSIDE JNI RUN CALL");
|
||||||
|
handle_ccb_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_nativeRunCCB(JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
LOGD("INSIDE JNI RUN CALL");
|
||||||
|
handle_ccb_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_nativeStopCCB(JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
LOGD("INSIDE JNI STOP CALL");
|
||||||
|
handle_ccb_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_nativeRunScript(JNIEnv* env, jobject thiz, jstring jsString)
|
||||||
|
{
|
||||||
|
LOGD("INSIDE JNI RUN SCRIPT CALL");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_nativeConnected(JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
handle_connected();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_cocos2dx_cocosplayer_CocosPlayerSocket_nativeDisconnected(JNIEnv* env, jobject thiz)
|
||||||
|
{
|
||||||
|
handle_disconnected();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
APPNAME="CocosPlayer"
|
||||||
|
APP_ANDROID_NAME="org.cocos2dx.cocosplayer"
|
||||||
|
|
||||||
|
if [ -z "${SDK_ROOT+aaa}" ]; then
|
||||||
|
# ... if SDK_ROOT is not set, use "$HOME/bin/android-sdk"
|
||||||
|
SDK_ROOT="$HOME/bin/android-sdk"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${NDK_ROOT+aaa}" ]; then
|
||||||
|
# ... if NDK_ROOT is not set, use "$HOME/bin/android-ndk"
|
||||||
|
NDK_ROOT="$HOME/bin/android-ndk"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${COCOS2DX_ROOT+aaa}" ]; then
|
||||||
|
# ... if COCOS2DX_ROOT is not set
|
||||||
|
# ... find current working directory
|
||||||
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
# ... use paths relative to current directory
|
||||||
|
COCOS2DX_ROOT="$DIR/../../.."
|
||||||
|
APP_ROOT="$DIR/.."
|
||||||
|
APP_ANDROID_ROOT="$DIR"
|
||||||
|
else
|
||||||
|
APP_ROOT="$COCOS2DX_ROOT/samples/$APPNAME"
|
||||||
|
APP_ANDROID_ROOT="$COCOS2DX_ROOT/samples/$APPNAME/proj.android"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "NDK_ROOT = $NDK_ROOT"
|
||||||
|
echo "SDK_ROOT = $SDK_ROOT"
|
||||||
|
echo "COCOS2DX_ROOT = $COCOS2DX_ROOT"
|
||||||
|
echo "APP_ROOT = $APP_ROOT"
|
||||||
|
echo "APP_ANDROID_ROOT = $APP_ANDROID_ROOT"
|
||||||
|
echo "APP_ANDROID_NAME = $APP_ANDROID_NAME"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Killing and restarting ${APP_ANDROID_NAME}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
"${SDK_ROOT}"/platform-tools/adb shell am force-stop "${APP_ANDROID_NAME}"
|
||||||
|
|
||||||
|
NDK_MODULE_PATH="${COCOS2DX_ROOT}":"${COCOS2DX_ROOT}"/cocos2dx/platform/third_party/android/prebuilt \
|
||||||
|
"${NDK_ROOT}"/ndk-gdb \
|
||||||
|
--adb="${SDK_ROOT}"/platform-tools/adb \
|
||||||
|
--verbose \
|
||||||
|
--start \
|
||||||
|
--force
|
|
@ -0,0 +1,20 @@
|
||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
|
@ -0,0 +1,13 @@
|
||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system use,
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-16
|
||||||
|
|
||||||
|
android.library.reference.1=../../../../cocos2dx/platform/android/java
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<AbsoluteLayout
|
||||||
|
android:id="@+id/widget32"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<Button
|
||||||
|
android:id="@+id/widget33"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Run"
|
||||||
|
android:layout_x="150dp"
|
||||||
|
android:layout_y="262dp" />
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/widget34"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="Auto"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:layout_x="40dp"
|
||||||
|
android:layout_y="302dp" />
|
||||||
|
<Button
|
||||||
|
android:id="@+id/widget35"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Reset"
|
||||||
|
android:layout_x="220dp"
|
||||||
|
android:layout_y="302dp" />
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/widget36"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Pairing code"
|
||||||
|
android:layout_x="30dp"
|
||||||
|
android:layout_y="282dp" />
|
||||||
|
</AbsoluteLayout>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">CocosDragonJS</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,175 @@
|
||||||
|
package org.cocos2dx.cocosplayer;
|
||||||
|
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.io.IOException;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.content.ContextWrapper;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Environment;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
import java.util.zip.ZipException;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class CCBFileUtilsHelper {
|
||||||
|
|
||||||
|
public static final String TAG = CocosPlayerSocket.class.getSimpleName();
|
||||||
|
private static boolean isValid(final File file) {
|
||||||
|
|
||||||
|
ZipFile zipfile = null;
|
||||||
|
try {
|
||||||
|
zipfile = new ZipFile(file);
|
||||||
|
return true;
|
||||||
|
} catch (ZipException e) {
|
||||||
|
Log.i(TAG, "ERROR: "+e.toString());
|
||||||
|
return false;
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.i(TAG, "ERROR: "+e.toString());
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (zipfile != null) {
|
||||||
|
zipfile.close();
|
||||||
|
zipfile = null;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.i(TAG, "ERROR: "+e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void unzip(InputStream is, Context cw) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
File path = new File(CCBFileUtilsHelper.getBaseDirectory(cw));
|
||||||
|
|
||||||
|
ZipInputStream zin = new ZipInputStream(is);
|
||||||
|
ZipEntry ze = null;
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((ze = zin.getNextEntry()) != null) {
|
||||||
|
Log.v(TAG, "Unzipping " + ze.getName());
|
||||||
|
|
||||||
|
if(ze.isDirectory()) {
|
||||||
|
_dirChecker(path, ze.getName());
|
||||||
|
} else {
|
||||||
|
File fileToWrite = new File(path, ze.getName());
|
||||||
|
FileOutputStream fout = new FileOutputStream(fileToWrite);
|
||||||
|
|
||||||
|
while ((length = zin.read(buffer))>0) {
|
||||||
|
fout.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
zin.closeEntry();
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
zin.close();
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.e(TAG, "unzip", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public static void unzip(String zipname) {
|
||||||
|
// try {
|
||||||
|
|
||||||
|
// String filename;
|
||||||
|
// //Context cw = getApplicationContext();
|
||||||
|
// //ContextWrapper cw = new ContextWrapper(this);
|
||||||
|
|
||||||
|
// File path = new File(CCBFileUtilsHelper.getBaseDirectory(cw));
|
||||||
|
// //File path = android.os.Environment.getExternalStorageDirectory(); //Environment.getExternalFilesDir();
|
||||||
|
// File ccbFile = new File(path, zipname);
|
||||||
|
|
||||||
|
// if(!isValid(ccbFile))
|
||||||
|
// Log.i(TAG, "Zip file recieved is INVALID: ");
|
||||||
|
// else {
|
||||||
|
// Log.i(TAG, "Zip file recieved is VALID: ");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// FileInputStream fin = new FileInputStream(ccbFile);
|
||||||
|
// ZipInputStream zin = new ZipInputStream(fin);
|
||||||
|
// ZipEntry ze = null;
|
||||||
|
// byte[] buffer = new byte[1024];
|
||||||
|
// int length;
|
||||||
|
// while ((ze = zin.getNextEntry()) != null) {
|
||||||
|
// Log.v(TAG, "Unzipping " + ze.getName());
|
||||||
|
|
||||||
|
// if(ze.isDirectory()) {
|
||||||
|
// _dirChecker(path, ze.getName());
|
||||||
|
// } else {
|
||||||
|
// File fileToWrite = new File(path, ze.getName());
|
||||||
|
// FileOutputStream fout = new FileOutputStream(fileToWrite);
|
||||||
|
|
||||||
|
// while ((length = zin.read(buffer))>0) {
|
||||||
|
// fout.write(buffer, 0, length);
|
||||||
|
// }
|
||||||
|
// zin.closeEntry();
|
||||||
|
// fout.close();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
// zin.close();
|
||||||
|
// } catch(Exception e) {
|
||||||
|
// Log.e(TAG, "unzip", e);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
private static void _dirChecker(File path, String dir) {
|
||||||
|
File f = new File(path, dir);
|
||||||
|
|
||||||
|
if(!f.isDirectory()) {
|
||||||
|
f.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unzipCCB(byte[] data, Context cw) {
|
||||||
|
String zipname = "ccb.zip";
|
||||||
|
unzip(new ByteArrayInputStream(data), cw);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBaseDirectory(Context cw) {
|
||||||
|
return cw.getCacheDir().getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File getBasePath() {
|
||||||
|
return android.os.Environment.getExternalStorageDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void cleanDir(File dir) {
|
||||||
|
|
||||||
|
long bytesDeleted = 0;
|
||||||
|
File[] files = dir.listFiles();
|
||||||
|
|
||||||
|
for (File file : files) {
|
||||||
|
if(file.isDirectory()) {
|
||||||
|
cleanDir(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Log.i(TAG, "Deleting file: "+file.getName());
|
||||||
|
bytesDeleted += file.length();
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void cleanCache(Context cw) {
|
||||||
|
File path = new File(getBaseDirectory(cw));
|
||||||
|
cleanDir(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
package org.cocos2dx.cocosplayer;
|
||||||
|
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.io.IOException;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.content.ContextWrapper;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Environment;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import com.dd.plist.NSDictionary;
|
||||||
|
import com.dd.plist.NSData;
|
||||||
|
import com.dd.plist.UID;
|
||||||
|
import com.dd.plist.PropertyListParser;
|
||||||
|
import com.dd.plist.BinaryPropertyListParser;
|
||||||
|
import com.dd.plist.BinaryPropertyListWriter;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
public class CCBStreamHandler {
|
||||||
|
|
||||||
|
public static final String TAG = CocosPlayerSocket.class.getSimpleName();
|
||||||
|
|
||||||
|
public static NSDictionary parseBinaryPLIST(InputStream is) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
NSDictionary rootDict = (NSDictionary)BinaryPropertyListParser.parse(is);
|
||||||
|
String name = rootDict.objectForKey("cmd").toString();
|
||||||
|
Log.i(TAG, "Cmd: "+name);
|
||||||
|
|
||||||
|
return rootDict;
|
||||||
|
|
||||||
|
} catch(Exception ex) {
|
||||||
|
Log.i(TAG, "ERROR: "+ex.toString());
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NSDictionary parseBinaryPLIST(byte[] is) {
|
||||||
|
try {
|
||||||
|
NSDictionary rootDict = (NSDictionary)BinaryPropertyListParser.parse(is);
|
||||||
|
String name = rootDict.objectForKey("cmd").toString();
|
||||||
|
Log.i(TAG, "Cmd: "+name);
|
||||||
|
return rootDict;
|
||||||
|
|
||||||
|
} catch(Exception ex) {
|
||||||
|
Log.i(TAG, "Error parsing BinaryPLIST: "+ex.toString());
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isKeepAlive(byte[] header) {
|
||||||
|
for(int i = 0; i < header.length; ++i) {
|
||||||
|
if((header[i] & 0xff) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int processHeader(byte[] header) {
|
||||||
|
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
if(isKeepAlive(header)) {
|
||||||
|
Log.v(TAG, "Keepalive Recieved");
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(header);
|
||||||
|
bb.order(ByteOrder.BIG_ENDIAN); // CocosBuilder transmits in Little Endian
|
||||||
|
|
||||||
|
length = bb.getInt();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.i(TAG, "Exception: "+e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i(TAG, "Payload Length: "+length);
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getDeviceInfo() {
|
||||||
|
try {
|
||||||
|
NSDictionary root = new NSDictionary();
|
||||||
|
root.put("cmd", "deviceinfo");
|
||||||
|
root.put("devicename", "TEST_ANDROID");
|
||||||
|
root.put("devicetype", "Android");
|
||||||
|
root.put("preferredresourcetype", "xlarge");
|
||||||
|
String payload = root.toXMLPropertyList();
|
||||||
|
|
||||||
|
// String data = new String(header, 0 , header.length);
|
||||||
|
return payload;
|
||||||
|
} catch(Exception e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2010-2012 cocos2d-x.org
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
package org.cocos2dx.cocosplayer;
|
||||||
|
|
||||||
|
import org.cocos2dx.lib.Cocos2dxActivity;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
public class CocosPlayer extends Cocos2dxActivity{
|
||||||
|
|
||||||
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
CocosPlayerSocket server = new CocosPlayerSocket();
|
||||||
|
server.setContext(getApplicationContext());
|
||||||
|
server.createServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.loadLibrary("cocosdragonjs");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,206 @@
|
||||||
|
package org.cocos2dx.cocosplayer;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.nsd.NsdManager;
|
||||||
|
import android.net.nsd.NsdManager.RegistrationListener;
|
||||||
|
import android.net.nsd.NsdManager.ResolveListener;
|
||||||
|
import android.net.nsd.NsdServiceInfo;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class CocosPlayerPresence extends Service {
|
||||||
|
private static boolean conn = false;
|
||||||
|
private static boolean running = false;
|
||||||
|
|
||||||
|
|
||||||
|
protected static String SERVICE_TYPE_AUTO = "_CocosPlayer._tcp.";
|
||||||
|
protected static String SERVICE_TYPE = "_CocosP-35._tcp.";
|
||||||
|
protected static String SERVICE_TYPE_PART1 = "_CocosP-";
|
||||||
|
protected static String SERVICE_TYPE_PART2 = "._tcp.";
|
||||||
|
|
||||||
|
protected static final String TAG = "CocosPlayerSocket";
|
||||||
|
|
||||||
|
private RegistrationListener mRegistrationListener;
|
||||||
|
private NsdManager.DiscoveryListener mDiscoveryListener;
|
||||||
|
private ResolveListener mResolveListener;
|
||||||
|
|
||||||
|
protected String mServiceName;
|
||||||
|
private NsdManager mNsdManager;
|
||||||
|
protected NsdServiceInfo mService;
|
||||||
|
private List<Socket> mConnections;
|
||||||
|
private List<NsdServiceInfo> mServiceList;
|
||||||
|
private Context cw;
|
||||||
|
|
||||||
|
public void setContext(Context c) {
|
||||||
|
cw = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPairing(int code) {
|
||||||
|
if(code == -1) {
|
||||||
|
SERVICE_TYPE = SERVICE_TYPE_AUTO;
|
||||||
|
} else {
|
||||||
|
SERVICE_TYPE = SERVICE_TYPE_PART1+Integer.toString(code)+SERVICE_TYPE_PART2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int startPresence(int port, int pairingCode) {
|
||||||
|
|
||||||
|
setPairing(pairingCode);
|
||||||
|
running = true;
|
||||||
|
mServiceList = new ArrayList<NsdServiceInfo>();
|
||||||
|
mConnections = new ArrayList<Socket>();
|
||||||
|
mNsdManager = (NsdManager) cw.getSystemService(Context.NSD_SERVICE);
|
||||||
|
|
||||||
|
// initializeDiscoveryListener();
|
||||||
|
initializeRegistrationListener();
|
||||||
|
initializeResolveListener();
|
||||||
|
|
||||||
|
// mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
|
||||||
|
// mDiscoveryListener);
|
||||||
|
|
||||||
|
registerService(port);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
running = false;
|
||||||
|
mNsdManager.unregisterService(mRegistrationListener);
|
||||||
|
//mNsdManager.stopServiceDiscovery(mDiscoveryListener);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregisterService() {
|
||||||
|
mNsdManager.unregisterService(mRegistrationListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerService(int port) {
|
||||||
|
NsdServiceInfo serviceInfo = new NsdServiceInfo();
|
||||||
|
|
||||||
|
serviceInfo.setServiceName(Build.SERIAL + "TEST-TEST" + new Date().getTime());
|
||||||
|
serviceInfo.setServiceType(SERVICE_TYPE);
|
||||||
|
serviceInfo.setPort(port);
|
||||||
|
|
||||||
|
mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD,
|
||||||
|
mRegistrationListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeRegistrationListener() {
|
||||||
|
mRegistrationListener = new NsdManager.RegistrationListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
|
||||||
|
Log.i(TAG, "Service Registered");
|
||||||
|
mServiceName = NsdServiceInfo.getServiceName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRegistrationFailed(NsdServiceInfo serviceInfo,
|
||||||
|
int errorCode) {
|
||||||
|
Log.i(TAG, "Service Registeration failed"+errorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceUnregistered(NsdServiceInfo arg0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUnregistrationFailed(NsdServiceInfo serviceInfo,
|
||||||
|
int errorCode) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeDiscoveryListener() {
|
||||||
|
|
||||||
|
mDiscoveryListener = new NsdManager.DiscoveryListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDiscoveryStarted(String regType) {
|
||||||
|
Log.d(TAG, "Service discovery started");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceFound(NsdServiceInfo service) {
|
||||||
|
Log.d(TAG, "Service discovery success");
|
||||||
|
Log.d(TAG, String.format("%s %s %s %d",
|
||||||
|
service.getServiceName(), service.getServiceType(),
|
||||||
|
service.getHost(), service.getPort()));
|
||||||
|
if (!service.getServiceType().contains(SERVICE_TYPE)) {
|
||||||
|
Log.d(TAG,
|
||||||
|
"Unknown Service Type: " + service.getServiceType());
|
||||||
|
} else if (service.getServiceName().equals(mServiceName)) {
|
||||||
|
Log.d(TAG, "Same machine: " + mServiceName);
|
||||||
|
} else {
|
||||||
|
mNsdManager.resolveService(service, mResolveListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceLost(NsdServiceInfo service) {
|
||||||
|
Log.e(TAG, "service lost" + service);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDiscoveryStopped(String serviceType) {
|
||||||
|
Log.i(TAG, serviceType + " Discovery stopped: " + serviceType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
||||||
|
Log.e(TAG, serviceType + " Discovery failed: Error code:"
|
||||||
|
+ errorCode);
|
||||||
|
mNsdManager.stopServiceDiscovery(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
|
||||||
|
Log.e(TAG, serviceType + " Discovery failed: Error code:"
|
||||||
|
+ errorCode);
|
||||||
|
mNsdManager.stopServiceDiscovery(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeResolveListener() {
|
||||||
|
mResolveListener = new NsdManager.ResolveListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResolveFailed(NsdServiceInfo serviceInfo,
|
||||||
|
int errorCode) {
|
||||||
|
Log.i(TAG, "Resolve failed" + errorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
||||||
|
Log.i(TAG, "Resolve Succeeded. " + serviceInfo);
|
||||||
|
|
||||||
|
if (serviceInfo.getServiceName().equals(mServiceName)) {
|
||||||
|
Log.d(TAG, "Same IP.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mService = serviceInfo;
|
||||||
|
mServiceList.add(mService);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,271 @@
|
||||||
|
package org.cocos2dx.cocosplayer;
|
||||||
|
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.content.ContextWrapper;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
import com.dd.plist.NSDictionary;
|
||||||
|
import com.dd.plist.NSData;
|
||||||
|
import com.dd.plist.UID;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
public class CocosPlayerSocket {
|
||||||
|
|
||||||
|
public static final String TAG = CocosPlayerSocket.class.getSimpleName();
|
||||||
|
private static boolean running = false;
|
||||||
|
private static Context cw = null;
|
||||||
|
|
||||||
|
private HashMap<Socket, String> mConnections;
|
||||||
|
private static ServerSocket server;
|
||||||
|
private static int mPairingCode = -1;
|
||||||
|
private static CocosPlayerPresence presence = null;
|
||||||
|
|
||||||
|
private void runCCB() {
|
||||||
|
Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
nativeRunCCB();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleConnected() {
|
||||||
|
nativeConnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleDisconnected() {
|
||||||
|
nativeDisconnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopCCB() {
|
||||||
|
nativeStopCCB();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runScript(String script) {
|
||||||
|
nativeRunScript(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static native void nativeRunCCB();
|
||||||
|
private static native void nativeConnected();
|
||||||
|
private static native void nativeDisconnected();
|
||||||
|
private static native void nativeStopCCB();
|
||||||
|
private static native void nativeRunScript(final String script);
|
||||||
|
|
||||||
|
private void switchCmd(NSDictionary data) {
|
||||||
|
try {
|
||||||
|
String cmd = data.objectForKey("cmd").toString();
|
||||||
|
String [] keys = data.allKeys();
|
||||||
|
for(int i =0 ; i < keys.length; ++i ) {
|
||||||
|
}
|
||||||
|
if(cmd.equalsIgnoreCase("zip")) {
|
||||||
|
CCBFileUtilsHelper.cleanCache(cw);
|
||||||
|
try {
|
||||||
|
Log.i(TAG, "Size of NSDATA payload: "+((NSData)data.objectForKey("data")).bytes().length);
|
||||||
|
CCBFileUtilsHelper.unzipCCB(((NSData)data.objectForKey("data")).bytes(), cw);
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.i(TAG, "Size of UID payload: "+((UID)data.objectForKey("data")).getBytes().length);
|
||||||
|
CCBFileUtilsHelper.unzipCCB(((UID)data.objectForKey("data")).getBytes(), cw);
|
||||||
|
}
|
||||||
|
} else if(cmd.equalsIgnoreCase("run")) {
|
||||||
|
runCCB();
|
||||||
|
} else if(cmd.equalsIgnoreCase("stop")) {
|
||||||
|
stopCCB();
|
||||||
|
} else if(cmd.equalsIgnoreCase("script")) {
|
||||||
|
runScript(data.objectForKey("script").toString());
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.i(TAG, "JSON Error: "+e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parsePayload(byte[] b) {
|
||||||
|
try {
|
||||||
|
NSDictionary rootDict = CCBStreamHandler.parseBinaryPLIST(b);
|
||||||
|
switchCmd(rootDict);
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.d(TAG, "Error writing payload to file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class StreamHandler extends AsyncTask<ServerSocket, ByteArrayOutputStream, Void> {
|
||||||
|
|
||||||
|
private void processPayload(final Socket client,final int length) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
int dataLength = ((length/4) > 16000) ? 16000 : (length/4);
|
||||||
|
byte[] data = new byte[dataLength];
|
||||||
|
|
||||||
|
int totalRead = 0, nRead;
|
||||||
|
while ((nRead = client.getInputStream().read(data, 0, ((length - totalRead) > data.length) ? data.length : (length - totalRead))) != -1 && totalRead < length) {
|
||||||
|
totalRead += nRead;
|
||||||
|
buffer.write(data, 0, nRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i(TAG, "Parsing payload. Totaly bytes read: "+totalRead);
|
||||||
|
|
||||||
|
data = null;
|
||||||
|
|
||||||
|
publishProgress(buffer);
|
||||||
|
|
||||||
|
buffer.flush();
|
||||||
|
buffer.close();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.i(TAG, "Exception: "+e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Void doInBackground(ServerSocket... args) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
handleDisconnected();
|
||||||
|
ServerSocket server = args[0];
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
Socket client = server.accept();
|
||||||
|
|
||||||
|
Log.i(TAG,"New connection from "+ client.getInetAddress());
|
||||||
|
handleConnected();
|
||||||
|
|
||||||
|
if(client == null) {
|
||||||
|
Log.i(TAG, "Client null");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
String data = CCBStreamHandler.getDeviceInfo();
|
||||||
|
ByteBuffer b = ByteBuffer.allocate(4);
|
||||||
|
b.order(ByteOrder.BIG_ENDIAN);
|
||||||
|
Log.i(TAG, "Payload Length: "+data.length());
|
||||||
|
b.putInt(data.length());
|
||||||
|
byte[] header = b.array();
|
||||||
|
|
||||||
|
Log.i(TAG, "Sending name "+data);
|
||||||
|
|
||||||
|
client.getOutputStream().write(header, 0 , header.length);
|
||||||
|
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
|
||||||
|
out.write(data);
|
||||||
|
out.flush();
|
||||||
|
|
||||||
|
processStream(client);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.i(TAG, "Server socket start fail!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.i(TAG, "Server Closing");
|
||||||
|
server.close();
|
||||||
|
|
||||||
|
} catch(Exception e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processStream(Socket client) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
int nRead, count = 0;
|
||||||
|
|
||||||
|
byte[] header = new byte[4];
|
||||||
|
|
||||||
|
while ((nRead = client.getInputStream().read(header, 0, header.length)) != -1) {
|
||||||
|
|
||||||
|
int lengthToRead = CCBStreamHandler.processHeader(header);
|
||||||
|
|
||||||
|
if(lengthToRead > 0) {
|
||||||
|
processPayload(client, lengthToRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.i(TAG, "Exception: "+e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The system calls this to perform work in the UI thread and delivers
|
||||||
|
* the result from doInBackground() */
|
||||||
|
protected void onPostExecute() {
|
||||||
|
try {
|
||||||
|
server.close();
|
||||||
|
} catch(Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onProgressUpdate(ByteArrayOutputStream... buffer) {
|
||||||
|
try {
|
||||||
|
byte[] b = buffer[0].toByteArray();
|
||||||
|
buffer[0].close();
|
||||||
|
System.gc();
|
||||||
|
parsePayload(b);
|
||||||
|
} catch(Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setContext(Context c) {
|
||||||
|
cw = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setPairingCode(int code) {
|
||||||
|
//mPresenceAsync.cancel(true);
|
||||||
|
if(presence != null) {
|
||||||
|
presence.unregisterService();
|
||||||
|
}
|
||||||
|
mPairingCode = code;
|
||||||
|
|
||||||
|
|
||||||
|
presence = new CocosPlayerPresence();
|
||||||
|
Log.i("CocosPlayerSocket", "Registering Bonjour on Port: "+server.getLocalPort()+" With pairing code: "+code);
|
||||||
|
presence.setContext(cw);
|
||||||
|
presence.startPresence(server.getLocalPort(), mPairingCode);
|
||||||
|
|
||||||
|
//new PresenceStarter().execute(server.getLocalPort(), mPairingCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createServer() {
|
||||||
|
|
||||||
|
Log.i(TAG, "Creating server "+running);
|
||||||
|
try {
|
||||||
|
server = new ServerSocket(0);
|
||||||
|
Log.i(TAG, "IP " + server.getInetAddress()
|
||||||
|
+ ", running on port " + server.getLocalPort());
|
||||||
|
|
||||||
|
presence = new CocosPlayerPresence();
|
||||||
|
presence.setContext(cw);
|
||||||
|
presence.startPresence(server.getLocalPort(), mPairingCode);
|
||||||
|
new StreamHandler().execute(server);
|
||||||
|
|
||||||
|
} catch(Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue