LuaJavaBridge - Lua 与 Java 互操作的简单解决方案

写了几个接口函数后,发现 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

你可能感兴趣的:(LuaJavaBridge - Lua 与 Java 互操作的简单解决方案)