写了几个接口函数后,发现 JNI 提供了完善的接口来操作 Java,比如查找特定的 Class、Method 等等。既然有这些东西,我想完全可以实现一个很薄的转接层。这个层会提供一些函数,让 Lua 代码可以直接调用到 Java 的方法。
经过一番努力,LuaJavaBridge(简称 luaj)诞生了。
luaj 主要特征
可以从 Lua 调用 Java Class Static Method
调用 Java 方法时,支持 int/float/boolean/String/Lua function 五种参数类型
可以将 Lua function 作为参数传递给 Java,并让 Java 保存 Lua function 的引用
可以从 Java 调用 Lua 的全局函数,或者调用引用指向的 Lua function
luaj 的功能很简单,但对于集成各种 SDK 来说已经完全满足需求了。
luaj 用法示例
下面的代码是我们游戏中实际使用的中国移动支付 SDK 调用代码,luaj 好不好用一目了然:
Lua 代码:
--[[
购买 1000 金币
Java 方法原型:
public static void GameInterface_doBilling(final String billingIndex,
final boolean useSms,
final boolean isRepeated,
final int luaFunctionId)
]]
-- 用于处理支付结果的函数
local function callback(result)
if result == "success" then
game.state:increaseCoins(1000)
game.state:save()
end
end
-- 调用 Java 方法需要的参数
local args = {
"001", -- billingIndex
true, -- useSms
true, -- isRepeated
callback -- luaFunctionId
}
-- Java 类的名称
local className = "com/qeeplay/frameworks/ChinaMobile_SDK"
-- 调用 Java 方法
luaj.callStaticMethod(className, "GameInterface_doBilling", args)
luaj 实现原理
luaj 的核心目标有两个:从 Lua 调用 Java, 从 Java 调用 Lua。整理出来就是如下几点:
查找并调用指定的 Java 方法
检查调用结果,并从 Java 方法获取返回值
将 Lua function 作为参数传递给 Java 方法
在 Java 方法中调用 Lua function