三个部分的代码模块,基于观察者模式,初始化代码添加观察者,等待lua消息。
lua:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 luabridge = {} luabridge.callback = nil function luaCallback (param) local callback = luabridge.callback if callback then callback(param) end end function luabridge.call (msg) local platform = cc.Application:getInstance():getTargetPlatform() if platform == cc.PLATFORM_OS_ANDROID then local class = "org/vizee/android/jli" local method = "callJava" local args = { msg, function (data) end } local sign = "(Ljava/lang/String;I)V" local luaj = require ("luaj" ) local ok, ret = luaj.callStaticMethod(class, method, args, sign) return ok elseif platform == cc.PLATFORM_OS_IPHONE then print ("call objc: " , msg) local class = "ocli" local method = "callObjc" local luaoc = require ("luaoc" ) local ok, ret = luaoc.callStaticMethod(class, method, {msg = msg}) return ok end return nil end if cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_IPHONE then require ("luaoc" ).callStaticMethod("ocli" , "callObjc" , { callback = luaCallback }) end
android:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package org.vizee.android;import java.util.HashMap;import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;public class jli { public interface Observer { String onMessage (String msg) ; } private static HashMap<String, Observer> observers = new HashMap <String, Observer>(); private static String dispatchMessage (String msg) { Observer observer = observers.get(msg); return observer != null ? observer.onMessage(msg) : "" ; } public static void setObserver (String msg, Observer observer) { if (handler == null ) { observers.remove(msg); } else { observers.put(msg, observer); } } public static void callJava (String msg, int luaFunctionId) { Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunctionId, dispatchMessage(msg)); Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFunctionId); } public static void callLua (String param) { Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("luaCallback" , param); } }
ios:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // // ocli.h // luaocbridge // // Created by vizee on 15/7/29. // // #ifndef luatest_ocli_h #define luatest_ocli_h #import <Foundation/Foundation.h> @protocol ocliObserver <NSObject> @required - (void) onMessage:(NSString *)msg; @end @interface ocli : NSObject { } + (void) setObserver:(id<ocliObserver>)observer forMsg:(NSString *) msg; + (NSDictionary *) callObjc:(NSDictionary *)dict; + (void) callLua:(const char *)param; @end #endif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 // // ocli.mm // luaocbridge // // Created by vizee on 15/7/28. // // #import "ocli.h" #import "platform/ios/CCLuaObjcBridge.h" static int _luaCallback = 0; static NSMutableDictionary *_observers = [[NSMutableDictionary alloc] init]; @implementation ocli + (void) setObserver:(id<ocliObserver>)observer forMsg:(NSString *)msg { if (observer == nil) { [_observers removeObjectForKey:msg]; } else { [_observers setValue:observer forKey:msg]; } } + (NSDictionary *) callObjc:(NSDictionary *)dict { NSString *msg = [dict objectForKey:@"msg"]; if (!msg || [msg length] == 0) { NSNumber *callbackId = [dict objectForKey:@"callback"]; if (!callbackId) { if (_luaCallback != 0) { cocos2d::LuaObjcBridge::releaseLuaFunctionById(_luaCallback); _luaCallback = 0; } return nil; } else { _luaCallback = [callbackId intValue]; cocos2d::LuaObjcBridge::retainLuaFunctionById(_luaCallback); } } else { id<ocliObserver> observer = [_observers objectForKey:msg]; if (observer) { [observer onMessage:msg]; } } return nil; } + (void) callLua:(const char *)param { cocos2d::LuaObjcBridge::pushLuaFunctionById(_luaCallback); cocos2d::LuaStack *stack = cocos2d::LuaObjcBridge::getStack(); stack->pushString(param); stack->executeFunction(1); } @end