chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Java方法中調(diào)用Lua function

工程師鄧生 ? 來(lái)源:芋道源碼 ? 作者:芋道源碼 ? 2022-09-07 10:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

luaj 主要特征

luaj 用法示例

luaj 實(shí)現(xiàn)原理

查找并調(diào)用指定的 Java 方法

從 Java 方法獲取返回值

將 Lua function 作為參數(shù)傳遞給 Java 方法

在某些業(yè)務(wù)場(chǎng)景下,我們可能會(huì)遇到 lua 中要調(diào)用 java 代碼情況,當(dāng)然這個(gè)用 JNI 肯定是可以做到的,但是有更加方便的辦法:LuaJavaBridge(LuaJava)和 LuaJ。

luaj 主要特征

可以從 Lua 調(diào)用 Java Class Static Method

調(diào)用 Java 方法時(shí),支持 int/float/boolean/String/Lua function 五種參數(shù)類型

可以將 Lua function 作為參數(shù)傳遞給 Java,并讓 Java 保存 Lua function 的引用

可以從 Java 調(diào)用 Lua 的全局函數(shù),或者調(diào)用引用指向的 Lua function

luaj 的功能很簡(jiǎn)單,但對(duì)于集成各種 SDK 來(lái)說(shuō)已經(jīng)完全滿足需求了。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

luaj 用法示例

Java 方法原型:

publicstaticfloatgetNum(floatn){
returnn;
}

lua 調(diào)用示例:

--Java類的名稱
localclassName="com/xttblog/Test"
--調(diào)用的Java方法名
localmethod='getNum'
--調(diào)用Java方法需要的參數(shù)
localn=10
localargs={
n
}
--調(diào)用Java方法
local_,testStaticMethod=luaj.callStaticMethod(className,method,args)

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

luaj 實(shí)現(xiàn)原理

luaj 的核心目標(biāo)有兩個(gè):從 Lua 調(diào)用 Java, 從 Java 調(diào)用 Lua。整理出來(lái)就是如下幾點(diǎn)

查找并調(diào)用指定的 Java 方法

檢查調(diào)用結(jié)果,并從 Java 方法獲取返回值

將 Lua function 作為參數(shù)傳遞給 Java 方法

在 Java 方法中調(diào)用 Lua function

查找并調(diào)用指定的 Java 方法

JNI 提供了 FindClass() 方法用于查找指定的 Class,所以 luaj.callStaticMethod() 的第一個(gè)參數(shù)就是要調(diào)用的 Java Class 的完整類名稱(類名稱中的“.”要替換為“/”)。

找到指定 Class 后,利用 JNI 的 GetStaticMethodID() 方法就可以找到這個(gè)類的指定靜態(tài)方法,前提是要提供靜態(tài)方法的名稱和簽名。

所謂簽名,就是指Java方法的參數(shù)類型和返回類型定義。方法的簽名就是類似(Ljava/lang/String;ZZI)V這樣的一串描述,通過(guò)字節(jié)碼方式可以查看,如下示例:

34c3e5bc-2e57-11ed-ba43-dac502259ad0.png


關(guān)于 Java 方法簽名的具體定義,可以參考:JNI Type Signatures。

這里要說(shuō)的是 luaj 可以根據(jù)調(diào)用參數(shù)自動(dòng)猜測(cè)方法簽名所以示例中我們并沒(méi)有寫簽名。

示例中指定參數(shù):

localargs={n}

luaj 根據(jù)這 個(gè)參數(shù),會(huì)構(gòu)造出正確的方法簽名。

注意:這里要說(shuō)的是 Lua 里沒(méi)有辦法準(zhǔn)確判斷一個(gè)數(shù)值是整數(shù)還是浮點(diǎn)數(shù),所以 luaj 在猜測(cè)方法簽名時(shí),假定所有的數(shù)值都是浮點(diǎn)數(shù)。所以下面調(diào)用會(huì)報(bào)錯(cuò):

publicstaticintgetNum(intn){
returnn;
}

--Java類的名稱
localclassName="com/xttblog/Test"
--調(diào)用的Java方法名
localmethod='getNum'
--調(diào)用Java方法需要的參數(shù)
localn=10
localargs={
n
}
--調(diào)用Java方法
local_,testStaticMethod=luaj.callStaticMethod(className,method,args)

這樣是不行的,所以這個(gè)時(shí)候我們要自己定義簽名。

下面給出正確的示例

publicstaticintgetNum(intn){
returnn;
}
--Java類的名稱
localclassName="com/xttblog/Test"
--調(diào)用的Java方法名
localmethod='getNum'
--調(diào)用Java方法需要的參數(shù)
localn=10
localargs={
n
}
--定義簽名--參數(shù):[I]nteger--返回值:[I]nt
localsig="(I)I"
--調(diào)用Java方法
local_,testStaticMethod=luaj.callStaticMethod(className,method,args,sig)

簽名使用“(依次排列的參數(shù)類型)返回值類型”的格式,幾個(gè)例子如下:

簽名解釋
()V 參數(shù):無(wú),返回值:無(wú)
(I)V 參數(shù):int,返回值:無(wú)
(Ljava/lang/String;)Z 參數(shù):字符串,返回值:布爾值
(IF)Ljava/lang/String;參數(shù):整數(shù)、浮點(diǎn)數(shù),返回值:字符串

這里列出不同類型對(duì)應(yīng)的 Java 簽名字符串:

類型名類型
I整數(shù),或者Luafunction
F浮點(diǎn)數(shù)
Z布爾值
Ljava/lang/String;字符串
VVoid空,僅用于指定一個(gè)Java方法不返回任何值

Java 方法里接收 Lua function 的參數(shù)必須定義為 int 類型

從 Java 方法獲取返回值

luaj 會(huì)檢查調(diào)用結(jié)果,并從 Java 方法獲取返回值。

luaj 調(diào)用 Java 方法時(shí),可能會(huì)出現(xiàn)各種錯(cuò)誤,因此 luaj 提供了一種機(jī)制讓 Lua 調(diào)用代碼可以確定 Java 方法是否成功調(diào)用。

luaj.callStaticMethod()會(huì)返回兩個(gè)值:

當(dāng)成功時(shí),第一個(gè)值為 true,第二個(gè)值是 Java 方法的返回值(如果有)。

當(dāng)失敗時(shí),第一個(gè)值為 false,第二個(gè)值是錯(cuò)誤代碼。

下面的代碼展示了如何檢查返回結(jié)果和獲得返回值:

publicstaticintAddTwoNumbers(finalintnumber1,finalintnumber2){
returnnumber1+number2;
}

Lua代碼

localargs={2,3}
localsig="(II)I"
localok,ret=luaj.callStaticMethod(className,"AddTwoNumbers",args,sig)

ifnotokthen
print("luajerror:",ret)
else
print("ret:",ret)--輸出ret:5
end

錯(cuò)誤代碼定義如下:

錯(cuò)誤代碼描述
-1不支持的參數(shù)類型或返回值類型
-2無(wú)效的簽名
-3沒(méi)有找到指定的方法
-4Java方法執(zhí)行時(shí)拋出了異常
-5Java虛擬機(jī)出錯(cuò)
-6Java虛擬機(jī)出錯(cuò)

將 Lua function 作為參數(shù)傳遞給 Java 方法

Lua 虛擬機(jī)中,Lua function 以值的形式保存。但這個(gè)值無(wú)法直接給 Java 用,所以 luaj 做了一個(gè) Lua function 引用表。當(dāng)一個(gè) Lua function 傳遞給 Java 時(shí),這個(gè) function 對(duì)應(yīng)的值會(huì)被存在引用表中,并獲得一個(gè)唯一的引用 ID (整數(shù))。Java 代碼拿到這個(gè)引用 ID 后,就可以很方便的調(diào)用該 Lua function 了。

所以 Java 方法里接收 Lua function 的參數(shù)必須定義為 int 類型。

示例:

publicstaticintgetNum(intn){
returnn;
}

localfunctioncallback(result)
---方法內(nèi)容
end
--Java類的名稱
localclassName="com/xttblog/Test"
--調(diào)用的Java方法名
localmethod='getNum'
--調(diào)用Java方法需要的參數(shù)
localargs={
callback
}
--定義簽名--參數(shù):[I]nteger--返回值:[I]nt
localsig="(I)I"
--調(diào)用Java方法
local_,testStaticMethod=luaj.callStaticMethod(className,method,args,sig)

另外,LuaJ 也很好用。只需引入 pom。

34ff6182-2e57-11ed-ba43-dac502259ad0.png

?然后直接把 lua 代碼當(dāng)做 String 字符串內(nèi)嵌到 Java 代碼中:

StringluaStr="print'hello,world!'";
Globalsglobals=JsePlatform.standardGlobals();
LuaValuechunk=globals.load(luaStr);
chunk.call();

也可以創(chuàng)建一個(gè) login.lua 腳本,內(nèi)容如下:

--無(wú)參函數(shù)
functionhello()
print'hello'
end
--帶參函數(shù)
functiontest(str)
print('datafromjavais:'..str)
return'haha'
end

然后,Java先載入login.lua腳本并編譯,然后再獲取指定名稱的函數(shù),無(wú)參的直接使用call()方法調(diào)用,帶參的需要通過(guò)invoke(LuaValue[])傳入?yún)?shù)表:

StringluaPath="res/lua/login.lua";//lua腳本文件所在路徑
Globalsglobals=JsePlatform.standardGlobals();
//加載腳本文件login.lua,并編譯
globals.loadfile(luaPath).call();
//獲取無(wú)參函數(shù)hello
LuaValuefunc=globals.get(LuaValue.valueOf("hello"));
//執(zhí)行hello方法
func.call();
//獲取帶參函數(shù)test
LuaValuefunc1=globals.get(LuaValue.valueOf("test"));
//執(zhí)行test方法,傳入String類型的參數(shù)參數(shù)
Stringdata=func1.call(LuaValue.valueOf("I'amfromJava!")).toString();
//打印lua函數(shù)回傳的數(shù)據(jù)
Logger.info("datareturnfromluais:"+data);

運(yùn)行結(jié)果如下:

hello
datafromjavais:I'amfromJava!
八月07,2022525下午com.tw.login.tools.Loggerinfo
信息: lua return data:haha
350b36b0-2e57-11ed-ba43-dac502259ad0.png



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3001

    瀏覽量

    116449
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    972

    瀏覽量

    30482
  • Lua
    Lua
    +關(guān)注

    關(guān)注

    0

    文章

    86

    瀏覽量

    11461
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Lua基礎(chǔ)語(yǔ)法更新篇(上)

    。而整個(gè)Lua虛擬機(jī)編譯后僅僅一百余K,經(jīng)過(guò)適當(dāng)?shù)牟眉暨€能做到更小,十分適合嵌入式的開發(fā)。 同時(shí),目前腳本引擎,Lua的運(yùn)行速度占有絕對(duì)優(yōu)勢(shì)。這些都決定了
    的頭像 發(fā)表于 01-23 19:56 ?92次閱讀
    <b class='flag-5'>Lua</b>基礎(chǔ)語(yǔ)法更新篇(上)

    C編譯器錯(cuò)誤與解決方法

    說(shuō)明局部變量i 函數(shù)未作任何的存取操作解決方法消除函數(shù)i 變量的宣告 2 Warning 206:’Music3’:missing fu
    發(fā)表于 01-22 08:03

    警惕兼容性陷阱:LuatOS-Air腳本LuatOS的運(yùn)行異常分析

    即使語(yǔ)法正確的LuatOS-Air腳本,LuatOS環(huán)境也可能出現(xiàn)“靜默失敗”——程序無(wú)報(bào)錯(cuò)但功能未執(zhí)行。這類問(wèn)題多與系統(tǒng)事件循環(huán)、模塊加載時(shí)機(jī)或硬件抽象層調(diào)用方式有關(guān)。本文通過(guò)多個(gè)真實(shí)
    的頭像 發(fā)表于 01-13 19:20 ?164次閱讀
    警惕兼容性陷阱:LuatOS-Air腳本<b class='flag-5'>在</b>LuatOS<b class='flag-5'>中</b>的運(yùn)行異常分析

    BTS50007-1LUA:高性能12V智能高端功率開關(guān)的深度解析

    BTS50007-1LUA:高性能12V智能高端功率開關(guān)的深度解析 電子設(shè)備的設(shè)計(jì),功率開關(guān)的性能和可靠性對(duì)整個(gè)系統(tǒng)的穩(wěn)定性起著至關(guān)重要的作用。今天,我們要深入探討的是英飛凌(Infineon
    的頭像 發(fā)表于 12-20 09:30 ?692次閱讀

    探索BTH50015 - 1LUA:高效智能高側(cè)功率開關(guān)的技術(shù)剖析

    探索BTH50015 - 1LUA:高效智能高側(cè)功率開關(guān)的技術(shù)剖析 電子工程師的日常設(shè)計(jì)工作,選擇合適的功率開關(guān)至關(guān)重要。今天,我們就來(lái)深入剖析一款名為BTH50015 - 1LUA
    的頭像 發(fā)表于 12-18 17:30 ?592次閱讀

    LUA例程-常用的回調(diào)函數(shù)使用說(shuō)明

    詳細(xì)說(shuō)明LUA腳本函數(shù)功能和對(duì)應(yīng)的應(yīng)用實(shí)例。對(duì)于LUA腳本編程有很大的幫助和提高技能。
    發(fā)表于 11-24 16:43 ?0次下載

    Python調(diào)用API教程

    兩個(gè)不同系統(tǒng)之間的信息交互。在這篇文章,我們將詳細(xì)介紹Python調(diào)用API的方法和技巧。 一、用Requests庫(kù)發(fā)送HTTP請(qǐng)求 使用Python調(diào)用API的第一步是發(fā)送HTTP
    的頭像 發(fā)表于 11-03 09:15 ?888次閱讀

    Java 物聯(lián)網(wǎng)與嵌入式系統(tǒng)的應(yīng)用前景與挑戰(zhàn)

    的生態(tài)系統(tǒng)和強(qiáng)大的社區(qū)支持,Java 智能家居、工業(yè)控制、可穿戴設(shè)備等場(chǎng)景展現(xiàn)出獨(dú)特優(yōu)勢(shì)。本文將探討 Java 嵌入式與物聯(lián)網(wǎng)
    的頭像 發(fā)表于 09-04 14:49 ?991次閱讀

    ArkUI-X平臺(tái)橋接Bridge說(shuō)明

    簡(jiǎn)介 平臺(tái)橋接用于客戶端(ArkUI)和平臺(tái)(Android或iOS)之間傳遞消息,即用于ArkUI與平臺(tái)雙向數(shù)據(jù)傳遞、ArkUI側(cè)調(diào)用平臺(tái)的方法、平臺(tái)調(diào)用ArkUI側(cè)的方法。 以An
    發(fā)表于 06-19 23:12

    EtherCAT運(yùn)動(dòng)控制卡應(yīng)用開發(fā)教程之Java

    運(yùn)動(dòng)控制卡的Java開發(fā)及DLL調(diào)用
    的頭像 發(fā)表于 06-13 14:29 ?893次閱讀
    EtherCAT運(yùn)動(dòng)控制卡應(yīng)用開發(fā)教程之<b class='flag-5'>Java</b>

    IAR Arm開發(fā)工具鏈--function_sections編譯選項(xiàng)的使用

    本文主要介紹IAR Arm開發(fā)工具鏈不修改源代碼的情況下使用??function_sections編譯選項(xiàng)把函數(shù)放到單獨(dú)的section。
    的頭像 發(fā)表于 06-13 13:53 ?1795次閱讀
    <b class='flag-5'>在</b>IAR Arm開發(fā)工具鏈<b class='flag-5'>中</b>--<b class='flag-5'>function</b>_sections編譯選項(xiàng)的使用

    ArkUI-X與Android橋接通信之方法回調(diào)

    ) => { console.error(\'error: \' + JSON.stringify(err)); }); 2.Android側(cè)實(shí)現(xiàn)被調(diào)用方法。 // xxx.ja
    發(fā)表于 06-08 22:16

    ArkUI-XPlugin生命周期開發(fā)指南

    ; } } } 添加ArkUI-X插件 StageActivity,新增addPlugin11+方法,并以字符串形式提供IArkUIXPlugin的實(shí)現(xiàn)類的完整包名,用于將開發(fā)者實(shí)現(xiàn)
    發(fā)表于 06-04 22:36

    [Actor]程序框圖編程時(shí),如何操作消息和方法對(duì)應(yīng)的VI

    actor應(yīng)用的關(guān)鍵: 當(dāng)在程序框圖編程時(shí),核心是針對(duì)“消息”vi 進(jìn)行操作,并不操作消息對(duì)應(yīng)的方法vi(具體要實(shí)現(xiàn)的功能)。 調(diào)用的消息vi時(shí),后臺(tái)自動(dòng)調(diào)用對(duì)應(yīng)方法vi。 相當(dāng)于
    發(fā)表于 05-13 18:10

    研發(fā)排查問(wèn)題的利器:一款方法調(diào)用棧跟蹤工具

    作者:京東物流 郭忠強(qiáng) 導(dǎo)語(yǔ) 本文從日常值班問(wèn)題排查痛點(diǎn)出發(fā),分析方法復(fù)用的調(diào)用鏈路和上下文業(yè)務(wù)邏輯,通過(guò)思考分析,借助棧幀開發(fā)了一個(gè)方法調(diào)用棧的鏈?zhǔn)礁櫣ぞ?,便于展示一次?qǐng)求的
    的頭像 發(fā)表于 05-06 17:24 ?3173次閱讀
    研發(fā)排查問(wèn)題的利器:一款<b class='flag-5'>方法</b><b class='flag-5'>調(diào)用</b>棧跟蹤工具