增加对js回调的支持

This commit is contained in:
cebgcontract 2022-07-25 15:17:39 +08:00
parent 3181d8b0d1
commit a2aa648458
13 changed files with 529 additions and 108 deletions

View File

@ -32,6 +32,7 @@
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h" #include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
#include "cocos/scripting/js-bindings/event/EventDispatcher.h" #include "cocos/scripting/js-bindings/event/EventDispatcher.h"
#include "cocos/scripting/js-bindings/manual/jsb_classtype.hpp" #include "cocos/scripting/js-bindings/manual/jsb_classtype.hpp"
#include "JcWallet.h"
USING_NS_CC; USING_NS_CC;
@ -61,18 +62,13 @@ bool AppDelegate::applicationDidFinishLaunching()
}); });
jsb_register_all_modules(); jsb_register_all_modules();
se->addRegisterCallback(jsb_register_walletevent_modules);
se->start(); se->start();
clock_t start,end;
start=clock();
se::AutoHandleScope hs; se::AutoHandleScope hs;
jsb_run_script("js/jsb-adapter/jsb-builtin.js"); jsb_run_script("js/jsb-adapter/jsb-builtin.js");
jsb_run_script("js/jcwallet.js"); jsb_run_script("js/jcwallet.js");
jsb_run_script("js/main.js"); jsb_run_script("js/main.js");
se::Value rval;
jsb_run_code("JSON.stringify(wallet[0])", &rval);
end=clock();
cocos2d::log("\n js load time: %f\n", (double)(end-start)/CLOCKS_PER_SEC);
se->addAfterCleanupHook([]() { se->addAfterCleanupHook([]() {
JSBClassType::destroy(); JSBClassType::destroy();
}); });

View File

@ -1,16 +1,25 @@
#include "JcWallet.h" #include "JcWallet.h"
#include "WalletEvent.h" #include "WalletEvent.h"
#include <atomic>
#include <iostream>
#include "stdarg.h"
#include <string> #include <string>
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h" #include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
#include "cocos/scripting/js-bindings/manual/jsb_global.h" #include "cocos/scripting/js-bindings/manual/jsb_global.h"
#include "scripting/js-bindings/event/EventDispatcher.h" #include "scripting/js-bindings/event/EventDispatcher.h"
#include "scripting/js-bindings/manual/jsb_conversions.hpp"
#include "platform/CCApplication.h" #include "platform/CCApplication.h"
#include "base/CCScheduler.h"
#include "scrypt/native-crypto.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC) #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
#import "AppDelegate.h" #include "AppDelegate.h"
#endif #endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
cocos2d::Application *cocos_android_app_init(int width, int height); cocos2d::Application *cocos_android_app_init(int width, int height);
#endif #endif
using namespace cocos2d; using namespace cocos2d;
NS_CC_BEGIN NS_CC_BEGIN
@ -18,6 +27,71 @@ NS_CC_BEGIN
cocos2d::Application *g_app = nullptr; cocos2d::Application *g_app = nullptr;
JcWallet *JcWallet::_instance = nullptr; JcWallet *JcWallet::_instance = nullptr;
bool _isStarted = false; bool _isStarted = false;
uv_async_t gasync = {0};
struct AsyncTaskData {
std::mutex mtx;
std::list<std::function<void()> > tasks;
};
// run in server thread loop
void flush_tasks_in_server_loop_cb(uv_async_t *asyn) {
AsyncTaskData *data = (AsyncTaskData *) asyn->data;
std::lock_guard<std::mutex> guard(data->mtx);
while (!data->tasks.empty()) {
// fetch task, run task
data->tasks.front()();
// drop task
data->tasks.pop_front();
}
}
void init_libuv_async_handle(uv_async_t *async) {
memset(async, 0, sizeof(uv_async_t));
uv_loop_t *loop = uv_default_loop();
uv_async_init(loop, async, cocos2d::flush_tasks_in_server_loop_cb);
async->data = new AsyncTaskData();
uv_run(loop, UV_RUN_DEFAULT);
}
// run in game thread, dispatch runnable object into server loop
int schedule_task_into_server_thread_task_queue(uv_async_t *asyn, std::function<void()> func) {
AsyncTaskData *data = (AsyncTaskData *) asyn->data;
{
std::lock_guard<std::mutex> guard(data->mtx);
data->tasks.emplace_back(func);
}
//notify server thread to invoke `flush_tasks_in_server_loop_cb()`
return uv_async_send(asyn);
}
#define RUN_IN_SERVERTHREAD(task) do { \
schedule_task_into_server_thread_task_queue(&gasync, [=](){ \
task; \
}); \
} while(0)
bool runGlobalMethod(const char *name, se::ValueArray args, se::Value *value) {
se::AutoHandleScope scope;
bool ok = false;
auto global = se::ScriptEngine::getInstance()->getGlobalObject();
se::Value func;
if (global->getProperty(name, &func) && func.isObject()) {
ok = func.toObject()->call(args, global, value);
}
return ok;
}
bool addToArgArray(se::ValueArray *args, const char *valChar) {
std::string strVal(valChar);
se::Value tmpVal;
bool ok = true;
ok &= std_string_to_seval(strVal, &tmpVal);
args->push_back(tmpVal);
return ok;
}
JcWallet::JcWallet() { JcWallet::JcWallet() {
JcWallet::_instance = this; JcWallet::_instance = this;
@ -33,80 +107,122 @@ NS_CC_BEGIN
EventDispatcher::init(); EventDispatcher::init();
g_app->start(); g_app->start();
_isStarted = true; _isStarted = true;
WalletEvent::Emit("wallet_init_event", "{}");
cocos2d::init_libuv_async_handle(&gasync);
} }
} }
void JcWallet::initJSThread(std::shared_ptr<JcWallet> wallet) {
wallet->initEnv();
}
void JcWallet::tick(float dt) {
g_app->getScheduler()->update(dt);
EventDispatcher::dispatchTickEvent(0);
}
JcWallet::~JcWallet() { JcWallet::~JcWallet() {
EventDispatcher::destroy(); EventDispatcher::destroy();
se::ScriptEngine::destroyInstance(); se::ScriptEngine::destroyInstance();
uv_loop_close(uv_default_loop());
JcWallet::_instance = nullptr; JcWallet::_instance = nullptr;
} }
char* JcWallet::initWallet() { char *JcWallet::runJsMethod(std::shared_ptr<JSMethodParam> data) {
cocos2d::log("thread: %ld call method %s", uv_thread_self(), data->methodName.c_str());
se::Value value; se::Value value;
jsb_run_code("jc.wallet.currentAccount().address", &value); bool ok = cocos2d::runGlobalMethod(data->methodName.c_str(), data->args, &value);
static std::string result = value.toString(); static std::string result;
WalletEvent::Emit("wallet_inited", "{1}"); if (value.isString()) {
WalletEvent::Emit("wallet_inited", "{2}"); if (ok && !value.isNullOrUndefined()) {
WalletEvent::Emit("wallet_inited", "{3}"); result = value.toString();
} else {
result = "";
}
cocos2d::log("method: %s ::result: %s", data->methodName.c_str(), result.c_str());
WalletEvent::Emit(data->funId.c_str(), result.c_str());
}
return const_cast<char *>(result.c_str()); return const_cast<char *>(result.c_str());
} }
char* JcWallet::signLogin(const char *nonceChar, const char *tipChar) { extern "C" {
std::string nonce(nonceChar); void initEnv() {
std::string tips(tipChar); if (!_isStarted) {
std::string jsCode = "jc.wallet.loginSign('" + nonce + "','" + tips + "')"; std::shared_ptr<JcWallet> wallet(JcWallet::getInstance());
se::Value value; std::thread([=]() {
jsb_run_code(jsCode, &value); JcWallet::initJSThread(wallet);
static std::string result = value.toString(); }).detach();
return const_cast<char*>(result.c_str()); }
}
void tick(float dt) {
if (_isStarted) {
schedule_task_into_server_thread_task_queue(&gasync, [=](){
JcWallet::getInstance()->tick(dt);
});
}
} }
char* JcWallet::createAccount() { int runWalletMethod(const char *funId, const char *methodName, int paramCount, char **paramList) {
se::Value value; JSMethodParam *data = new JSMethodParam();
jsb_run_code("jc.wallet.createAccount()", &value); std::string methodNameStr(methodName);
static std::string result = value.toString(); data->methodName = methodNameStr;
return const_cast<char*>(result.c_str()); data->funId = funId;
data->paramCount = paramCount;
addToArgArray(&data->args, funId);
for (int i = 0; i < paramCount; i++) {
char *arg = *(paramList + i);
addToArgArray(&data->args, arg);
} }
std::shared_ptr<JSMethodParam> params(data);
char* JcWallet::importAccount(const char *privateKey){ int result = schedule_task_into_server_thread_task_queue(&gasync, [=](){
std::string key(privateKey); JcWallet::getInstance()->runJsMethod(params);
std::string jsCode = "jc.wallet.importAccount('" + key + "')"; });
se::Value value; // RUN_IN_SERVERTHREAD(JcWallet::getInstance()->runJsMethod(params));
jsb_run_code(jsCode, &value); return result == 0 ? 1 : 0;
static std::string result = value.toString();
return const_cast<char*>(result.c_str());
}
char* JcWallet::runJsMethod(const char *methodName, const char *paramObj) {
std::string methodStr(methodName);
std::string paramsStr(paramObj);
std::string jsCode = "jc.wallet."+methodStr+"('" + paramsStr + "')";
se::Value value;
jsb_run_code(jsCode, &value);
static std::string result = value.toString();
return const_cast<char*>(result.c_str());
}
extern "C"
{
char* initWallet() {
JcWallet::getInstance()->initEnv();
return JcWallet::getInstance()->initWallet();
}
char* signLogin(const char *nonceChar, const char *tipChar) {
return JcWallet::getInstance()->signLogin(nonceChar, tipChar);
}
char* createAccount() {
return JcWallet::getInstance()->createAccount();
}
char* importAccount(const char *privateKey) {
return JcWallet::getInstance()->importAccount(privateKey);
}
char* runWalletMethod(const char *methodName, const char *paramObj) {
return JcWallet::getInstance()->runJsMethod(methodName, paramObj);
} }
} }
NS_CC_END NS_CC_END
static bool getOrCreatePlainObject_r(const char* name, se::Object* parent, se::Object** outObj)
{
assert(parent != nullptr);
assert(outObj != nullptr);
se::Value tmp;
if (parent->getProperty(name, &tmp) && tmp.isObject())
{
*outObj = tmp.toObject();
(*outObj)->incRef();
}
else
{
*outObj = se::Object::createPlainObject();
parent->setProperty(name, se::Value(*outObj));
}
return true;
}
bool jsb_wallet_callback(se::State& s) {
const auto& args = s.args();
size_t argc = args.size();
if (argc >= 2) {
bool ok;
std::string funId;
ok = seval_to_std_string(args[0], &funId);
SE_PRECONDITION2(ok, false, "Error processing arguments");
std::string msg;
ok = seval_to_std_string(args[1], &msg);
SE_PRECONDITION2(ok, false, "Error processing arguments");
WalletEvent::Emit(funId.c_str(), msg.c_str());
return true;
}
return false;
}
SE_BIND_FUNC(jsb_wallet_callback)
bool jsb_register_walletevent_modules(se::Object* global) {
getOrCreatePlainObject_r("jsb", global, &__jsbObj);
__jsbObj->defineFunction("jcCallback", _SE(jsb_wallet_callback));
return true;
}

View File

@ -1,20 +1,47 @@
#include "uv.h"
#include "cocos2d.h" #include "cocos2d.h"
#include "stdarg.h"
#include "scripting/js-bindings/manual/jsb_conversions.hpp"
#include <thread>
#include <memory>
#include <mutex>
#include <list>
#include <atomic>
#include "base/ccMacros.h" #include "base/ccMacros.h"
NS_CC_BEGIN NS_CC_BEGIN
struct JSMethodParam {
std::string methodName;
std::string funId;
int paramCount;
se::ValueArray args;
};
bool addToArgArray(se::ValueArray *args, const char *valChar);
class CC_DLL JcWallet { class CC_DLL JcWallet {
public: public:
void initEnv(); void initEnv();
JcWallet(); JcWallet();
virtual ~JcWallet(); virtual ~JcWallet();
static JcWallet *getInstance() { return _instance; } static JcWallet *getInstance() { return _instance; }
char* initWallet();
char* signLogin(const char *nonceChar, const char *tipChar); char *runJsMethod(std::shared_ptr<JSMethodParam> data);
char* createAccount();
char* importAccount(const char *privateKey); static void initJSThread(std::shared_ptr<JcWallet> wallet);
char* runJsMethod(const char *methodName, const char *paramObj);
static void tick(float dt);
void performFunctionInCocosThread( const std::function<void()> &function);
private: private:
static JcWallet *_instance; static JcWallet *_instance;
std::vector<std::function<void()>> _functionsToPerform;
std::mutex _performMutex;
}; };
NS_CC_END NS_CC_END
bool jsb_register_walletevent_modules(se::Object* global);

View File

@ -8,10 +8,10 @@
#include "WalletEvent.h" #include "WalletEvent.h"
// 定义函数指针用来接受C#的委托 // 定义函数指针用来接受C#的委托
void(*WalletEvent::Emit)(char* name, char* message); void(*WalletEvent::Emit)(const char* name, const char* message);
// 注册C#的委托 // 注册C#的委托
void registWalletEventDelegate(void(*Emit)(char* name, char* message)) void registWalletEventDelegate(void(*Emit)(const char* name, const char* message))
{ {
WalletEvent::Emit = Emit; WalletEvent::Emit = Emit;
} }

View File

@ -12,11 +12,11 @@ extern "C"
class WalletEvent class WalletEvent
{ {
public: public:
static void (*Emit)(char* name, char* message); static void (*Emit)(const char* name, const char* message);
}; };
// 注册C#的委托 // 注册C#的委托
void registWalletEventDelegate(void (*Emit)(char* name, char* message)); void registWalletEventDelegate(void (*Emit)(const char* name, const char* message));
} }

BIN
Libraries/libuv_a.a Normal file

Binary file not shown.

View File

@ -76,6 +76,7 @@
B39C4391A8C22B442413FE00 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90994FBFA981DC89AB1ADF90 /* LaunchScreen-iPad.xib */; }; B39C4391A8C22B442413FE00 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90994FBFA981DC89AB1ADF90 /* LaunchScreen-iPad.xib */; };
C7134CE09546D0C147DAA3D3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 5C824C7597221AFF9649D008 /* LaunchScreen-iPad.png */; }; C7134CE09546D0C147DAA3D3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 5C824C7597221AFF9649D008 /* LaunchScreen-iPad.png */; };
D0DD4D8D8AC82F06A4331428 /* libil2cpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 924940699744FB37428516DD /* libil2cpp.a */; }; D0DD4D8D8AC82F06A4331428 /* libil2cpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 924940699744FB37428516DD /* libil2cpp.a */; };
D52A8DA1288E6547006574E8 /* libuv_a.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D52A8D9F288E6547006574E8 /* libuv_a.a */; };
D5538BA5287E9908000BDFB6 /* WalletEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5538BA3287E9908000BDFB6 /* WalletEvent.cpp */; }; D5538BA5287E9908000BDFB6 /* WalletEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5538BA3287E9908000BDFB6 /* WalletEvent.cpp */; };
D5F2CED6287BE9C4003C2B62 /* Data in Resources */ = {isa = PBXBuildFile; fileRef = D5F2CED5287BE9C4003C2B62 /* Data */; }; D5F2CED6287BE9C4003C2B62 /* Data in Resources */ = {isa = PBXBuildFile; fileRef = D5F2CED5287BE9C4003C2B62 /* Data */; };
D5F2CF41287BEC0D003C2B62 /* Bulk_Generics_3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5F2CED8287BEC0D003C2B62 /* Bulk_Generics_3.cpp */; }; D5F2CF41287BEC0D003C2B62 /* Bulk_Generics_3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5F2CED8287BEC0D003C2B62 /* Bulk_Generics_3.cpp */; };
@ -346,6 +347,7 @@
AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = "<group>"; }; AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = "<group>"; };
AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = "<group>"; }; AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = "<group>"; };
C6CC4EECB3BBA57C6F9A8015 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; C6CC4EECB3BBA57C6F9A8015 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; };
D52A8D9F288E6547006574E8 /* libuv_a.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libuv_a.a; sourceTree = "<group>"; };
D5538BA3287E9908000BDFB6 /* WalletEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WalletEvent.cpp; sourceTree = "<group>"; }; D5538BA3287E9908000BDFB6 /* WalletEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WalletEvent.cpp; sourceTree = "<group>"; };
D5538BA4287E9908000BDFB6 /* WalletEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WalletEvent.h; sourceTree = "<group>"; }; D5538BA4287E9908000BDFB6 /* WalletEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WalletEvent.h; sourceTree = "<group>"; };
D5F2CED5287BE9C4003C2B62 /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Data; path = ../tebg/Data; sourceTree = "<group>"; }; D5F2CED5287BE9C4003C2B62 /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Data; path = ../tebg/Data; sourceTree = "<group>"; };
@ -491,6 +493,7 @@
8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */,
7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */,
8A20382D213D4B3C005E6C56 /* AVKit.framework in Frameworks */, 8A20382D213D4B3C005E6C56 /* AVKit.framework in Frameworks */,
D52A8DA1288E6547006574E8 /* libuv_a.a in Frameworks */,
56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */,
56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */,
7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */,
@ -873,6 +876,7 @@
D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */,
03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */,
924940699744FB37428516DD /* libil2cpp.a */, 924940699744FB37428516DD /* libil2cpp.a */,
D52A8D9F288E6547006574E8 /* libuv_a.a */,
); );
path = Libraries; path = Libraries;
sourceTree = SOURCE_ROOT; sourceTree = SOURCE_ROOT;
@ -1251,9 +1255,10 @@
LD_GENERATE_MAP_FILE = YES; LD_GENERATE_MAP_FILE = YES;
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"\"$(SRCROOT)\"", "$(SRCROOT)",
"\"$(SRCROOT)/Libraries\"", "\"$(SRCROOT)/Libraries\"",
"/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs", "/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs",
"$(PROJECT_DIR)/Libraries",
); );
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
@ -1325,9 +1330,10 @@
LD_GENERATE_MAP_FILE = YES; LD_GENERATE_MAP_FILE = YES;
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"\"$(SRCROOT)\"", "$(SRCROOT)",
"\"$(SRCROOT)/Libraries\"", "\"$(SRCROOT)/Libraries\"",
"/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs", "/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs",
"$(PROJECT_DIR)/Libraries",
); );
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
@ -1484,7 +1490,7 @@
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt"; USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/include/uv";
}; };
name = ReleaseForRunning; name = ReleaseForRunning;
}; };
@ -1529,9 +1535,10 @@
LD_GENERATE_MAP_FILE = YES; LD_GENERATE_MAP_FILE = YES;
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"\"$(SRCROOT)\"", "$(SRCROOT)",
"\"$(SRCROOT)/Libraries\"", "\"$(SRCROOT)/Libraries\"",
"/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs", "/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs",
"$(PROJECT_DIR)/Libraries",
); );
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
@ -1631,7 +1638,7 @@
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt"; USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/include/uv";
}; };
name = ReleaseForProfiling; name = ReleaseForProfiling;
}; };
@ -1675,9 +1682,10 @@
LD_GENERATE_MAP_FILE = YES; LD_GENERATE_MAP_FILE = YES;
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"\"$(SRCROOT)\"", "$(SRCROOT)",
"\"$(SRCROOT)/Libraries\"", "\"$(SRCROOT)/Libraries\"",
"/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs", "/Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/libs",
"$(PROJECT_DIR)/Libraries",
); );
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
@ -1779,7 +1787,7 @@
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt"; USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/include/uv";
}; };
name = Debug; name = Debug;
}; };
@ -1800,7 +1808,7 @@
OTHER_LDFLAGS = ""; OTHER_LDFLAGS = "";
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt"; USER_HEADER_SEARCH_PATHS = "/Users/zhl/Documents/workspace/cocos/cocos2d-x /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/network /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/base /Users/zhl/Documents/workspace/cocos/cocos2d-x/extensions /Users/zhl/Documents/workspace/cocos/cocos2d-x/external /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/sources /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/chipmunk/include/chipmunk /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scripting/js-bindings/manual /Users/zhl/Documents/workspace/cocos/cocos2d-x/cocos/scrypt /Users/zhl/Documents/workspace/cocos/cocos2d-x/external/ios/include/uv";
}; };
name = Release; name = Release;
}; };

View File

@ -59,6 +59,7 @@
buildConfiguration = "ReleaseForRunning" buildConfiguration = "ReleaseForRunning"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
disableMainThreadChecker = "YES"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"

View File

@ -31,10 +31,88 @@
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "881" startingLineNumber = "881"
endingLineNumber = "881" endingLineNumber = "881">
landmarkName = "JSB_cryptoScrypt(s)" </BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "7EC97F82-E49A-4691-A304-6A0B8528ED64"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes_cocos/JcWallet.cpp"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "158"
endingLineNumber = "158"
landmarkName = "tick(dt)"
landmarkType = "9"> landmarkType = "9">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "3B15BB3A-5820-4171-B3E3-ACF515C353DE"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes_cocos/JcWallet.cpp"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "120"
endingLineNumber = "120"
landmarkName = "JcWallet::tick(dt)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "F73D5391-C9FC-465E-BDC5-F37B2F9B83E3"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../../cocos/cocos2d-x/cocos/base/CCScheduler.cpp"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "460"
endingLineNumber = "460"
landmarkName = "Scheduler::update(dt)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "9A9C4B5F-9C59-4E59-8ACA-9D39B4593C20"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../../cocos/cocos2d-x/cocos/platform/ios/CCApplication-ios.mm"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "62"
endingLineNumber = "62"
landmarkName = "-initWithApplication:"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "42E93B27-26C3-4DF6-83E1-39E31DA75188"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../../cocos/cocos2d-x/cocos/platform/ios/CCApplication-ios.mm"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "178"
endingLineNumber = "178"
landmarkName = "Application::Application(name, width, height)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints> </Breakpoints>
</Bucket> </Bucket>

File diff suppressed because one or more lines are too long

View File

@ -355,7 +355,6 @@ function tick(nowMilliSeconds) {
window.onload(event); window.onload(event);
} }
} }
fireTimeout(nowMilliSeconds); fireTimeout(nowMilliSeconds);
for (var id in _requestAnimationFrameCallbacks) { for (var id in _requestAnimationFrameCallbacks) {
@ -368,7 +367,7 @@ function tick(nowMilliSeconds) {
} }
} }
flushCommands(); // flushCommands();
} }
var _timeoutIDIndex = 0; var _timeoutIDIndex = 0;

View File

@ -1,6 +1,202 @@
console.log('hi tiny cocos') console.log('>>hi tiny wallet3')
var start = Date.now();
var wallet = new jcwallet.default(); /**
console.log(`init wallet time: ${(Date.now() - start)/1000 }`) * 初始化钱包, 所有操作进行前, 必须调用此方法
var account = jc.wallet.currentAccount(); * @param {string} password: 用于加密钱包数据的密码
console.log('[WALLET]' + account.address); * @return {string} 当前激活帐户的地址
*/
function initWallet(funId,password) {
try {
if ( !window.jc || !jc.wwallet ) {
var wallet = new jcwallet.default(password);
}
let address = jc.wallet.currentAccount().address
return JSON.stringify({errcode: 0, data: address});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 钱包当前激活的帐号的详细信息
*/
function currentAccount(funId) {
try {
let data = jc.wallet.currentAccountData;
return JSON.stringify({errcode: 0, data});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前链所有帐号列表
*/
function accountList(funId) {
try {
let data = jc.wallet.accounts;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取所有支持的链的列表
*/
function chainList(funId) {
try {
let data = jc.wallet.chainList;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 当前链的信息
*/
function currentChain(funId) {
try {
let data = jc.wallet.currentChain;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 切换当前链
* 切换链需要调用currentAccount方法, 以刷新界面显示
*/
function changeChain(funId,chainId) {
try {
chainId = parseInt(chainId);
let data = jc.wallet.updateCurrentChain(chainId);
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前帐户的登录签名
* @param {string} nonce: 从服务端获取的nonce
* @param {string} tips: 签名时的提示
*/
function loginSign(funId, nonce, tips) {
try {
let result = jc.wallet.loginSign(nonce, tips);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 创建一个新帐号, 并将新建帐号设为当前激活帐号
* @return {string} 当前激活帐户的地址
*/
function createAccount(funId) {
try {
let result = jc.wallet.createAccount();
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 用导入一个密钥, 并将导入的帐号设为当前激活帐号
* @return {string} 当前激活帐户的地址
*/
function importAccount(funId, privateKey) {
try {
let address = jc.wallet.importAccount(privateKey)
return JSON.stringify({errcode: 0, data: address});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 将一个帐号地址设为当前激活帐号
*/
function selectAccount(funId, address) {
try {
let result = jc.wallet.selectAccount(address);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前链上基础代币的余额
* @param {string} address: 待查询的帐户地址
* 不传的话, 则获取当前帐户的余额
*/
function getEthBalance(funId, address) {
jc.wallet.getBalance(address)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 将当前帐户里的基础代币转账给别人
* @param {string} to: 转账目标地址
* @param {string} amount: 转账数量
*/
function sendEth(funId, to, amount) {
jc.wallet.sendEth(to, amount)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 生成hash图片
* @param {string} msg: 要生成图片的内容
* @param {string} diameter: 图片尺寸
*/
function generateIcon(funId, msg, diameter) {
try {
diameter = parseFloat(diameter);
let result = jc.wallet.generateIconData(msg, diameter);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取ERC20代币的基本信息, 包括symbol和decimal
* 这些信息一般都不会变化, 客户端需缓存这些信息
* @param {string} address: 代币的地址
*/
function erc20Info(funId, address) {
jc.wallet.erc20Info(address)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 获取erc20代币的余额
* @param {string} address: 代币地址
* @param {string} account: 所属帐户的地址, 不传该参数的话, 获取当前钱包激活帐户的余额
*/
function erc20Balance(funId, address, account) {
jc.wallet.erc20Balance(address, account)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
function sendErc20(funId, address, to, amount) {
jc.wallet.sendErc20(address, to, amount)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}