cocos2d-x接入支付等sdk时,如果逻辑写在lua端,经常会用到lua与java的交互,下面通过一个实例来实现lua与java的交互过程

一、lua端

lua中使用luaj.callStaticMethod调用java静态方法

12345678910111213localfunctiononCallBack(msg)--回调处理ifmsg=="success"--endendlocalfunctioncallJavaCallBackLua()localluaj=require"cocos.cocos2d.luaj"localclassName="org/cocos2dx/cpp/AppActivity"localargs={"test",onCallBack}localsigs="(Ljava/lang/String;I)V"localok=luaj.callStaticMethod(className,"callJavaMethod",args,sigs)end

以上实现通过lua端调用java的静态方法callJavaMethod,并传入2个参数,一个字符串“test”和一个回调函数onCallBack


二、java端

cocos2d-x提供了Cocos2dxLuaJavaBridge带有如下方法可以使用:

1234publicstaticnativeintcallLuaFunctionWithString(intluaFunctionId,Stringvalue);//调用局部Lua-FunctionpublicstaticnativeintcallLuaGlobalFunctionWithString(StringluaFunctionName,Stringvalue);//调用全局Lua-FunctionpublicstaticnativeintretainLuaFunction(intluaFunctionId);//retain一次Lua-FunctionpublicstaticnativeintreleaseLuaFunction(intluaFunctionId);//release掉Lua-Function

在这里我们使用调用局部Lua-Function callLuaFunctionWithString来做示例

在AppActivity.java合适位置中加入代码

1importorg.cocos2dx.lib.Cocos2dxLuaJavaBridge;1staticintluaFuncCallback=0;1234publicstaticvoidcallJavaMethod(finalStringtest,finalintluaFunc){//Java中可以直接回调这个函数,也可以先保存下来这个注册的Lua局部函数,一般都是保存下来,等待启用SDK充值逻辑走完后再回调luaFuncCallback=luaFunc;}1234567mainActivity.runOnGLThread(newRunnable(){@Overridepublicvoidrun(){Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFuncCallback,"success");Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFuncCallback);}});