色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

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

工程師鄧生 ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-09-07 10:47 ? 次閱讀

luaj 主要特征

luaj 用法示例

luaj 實現(xiàn)原理

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

從 Java 方法獲取返回值

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

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

luaj 主要特征

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

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

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

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

luaj 的功能很簡單,但對于集成各種 SDK 來說已經(jīng)完全滿足需求了。

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

luaj 實現(xiàn)原理

luaj 的核心目標有兩個:從 Lua 調(diào)用 Java, 從 Java 調(diào)用 Lua。整理出來就是如下幾點

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

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

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

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

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

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

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

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

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


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

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

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

localargs={n}

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

注意:這里要說的是 Lua 里沒有辦法準確判斷一個數(shù)值是整數(shù)還是浮點數(shù),所以 luaj 在猜測方法簽名時,假定所有的數(shù)值都是浮點數(shù)。所以下面調(diào)用會報錯:

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)

這樣是不行的,所以這個時候我們要自己定義簽名。

下面給出正確的示例

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ù)類型)返回值類型”的格式,幾個例子如下:

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

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

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

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

從 Java 方法獲取返回值

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

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

luaj.callStaticMethod()會返回兩個值:

當成功時,第一個值為 true,第二個值是 Java 方法的返回值(如果有)。

當失敗時,第一個值為 false,第二個值是錯誤代碼。

下面的代碼展示了如何檢查返回結(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

錯誤代碼定義如下:

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

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

Lua 虛擬機中,Lua function 以值的形式保存。但這個值無法直接給 Java 用,所以 luaj 做了一個 Lua function 引用表。當一個 Lua function 傳遞給 Java 時,這個 function 對應(yīng)的值會被存在引用表中,并獲得一個唯一的引用 ID (整數(shù))。Java 代碼拿到這個引用 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 代碼當做 String 字符串內(nèi)嵌到 Java 代碼中:

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

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

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

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

StringluaPath="res/lua/login.lua";//lua腳本文件所在路徑
Globalsglobals=JsePlatform.standardGlobals();
//加載腳本文件login.lua,并編譯
globals.loadfile(luaPath).call();
//獲取無參函數(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);

運行結(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2982

    瀏覽量

    106125
  • 虛擬機
    +關(guān)注

    關(guān)注

    1

    文章

    954

    瀏覽量

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

    關(guān)注

    0

    文章

    81

    瀏覽量

    10679
收藏 0人收藏

    評論

    相關(guān)推薦

    有沒有什么方案能實現(xiàn)直接用matlab或python調(diào)用D4100_usb.dll?

    我實驗室購入一塊DLPLCR70EVM并搭配DLPLCR410EVM使用,由于Discovery 4100 Explorer程序不能滿足實驗需要,我論壇上找到方法通過D4100_usb.dll
    發(fā)表于 02-27 06:59

    nginx+lua+redis實現(xiàn)灰度發(fā)布

    了這種能力,隨時可以基于這種能力和思想調(diào)整實現(xiàn)方案:比如nginx+lua+(其他數(shù)據(jù)源)、nginx+(其他腳本語言) 一、灰度方案: 常見的灰度實現(xiàn)方案: 1.請求路由:通過請求的標識(如用戶ID、設(shè)備ID、請求頭等)來決定是否將請求路由到灰度環(huán)境。可以使用反向代
    的頭像 發(fā)表于 12-17 10:01 ?267次閱讀

    SSM框架在Java開發(fā)的應(yīng)用 如何使用SSM進行web開發(fā)

    。以下是對SSM框架在Java開發(fā)的應(yīng)用,以及如何使用SSM進行web開發(fā)的介紹: SSM框架的組件及其作用 Spring :Spring是一個開源的Java/Java EE全功能棧
    的頭像 發(fā)表于 12-16 17:28 ?988次閱讀

    Open開發(fā)新方法Lua語言快速學(xué)習(xí)

    很多朋友都問我不會Lua又想open開發(fā),怎么辦?我的答復(fù)是Lua先學(xué)起來,再看LuatOS具體應(yīng)用示例,上手極快,感興趣的朋友們,可以參照本文一起學(xué)。
    的頭像 發(fā)表于 12-11 09:31 ?318次閱讀
    Open開發(fā)新<b class='flag-5'>方法</b>!<b class='flag-5'>Lua</b>語言快速學(xué)習(xí)

    不會Lua又想Open開發(fā),怎么辦?

    本次我把收藏已久的LuatOS具體應(yīng)用示例特分享個大家,希望不會Lua又想Open開發(fā)的朋友有收獲。
    的頭像 發(fā)表于 12-09 14:43 ?340次閱讀
    不會<b class='flag-5'>Lua</b>又想Open開發(fā),怎么辦?

    AIGC系統(tǒng)多個模型的切換調(diào)用方案探索

    作者:京東科技 賈玉龍 1 背景 1.1 現(xiàn)狀 AIGC系統(tǒng)多個模型的切換調(diào)用通常指的是同一個AIGC系統(tǒng)或應(yīng)用,可以根據(jù)不同的輸入條件或任務(wù)需求,動態(tài)地選擇并
    的頭像 發(fā)表于 11-27 11:43 ?368次閱讀
    AIGC系統(tǒng)<b class='flag-5'>中</b>多個模型的切換<b class='flag-5'>調(diào)用</b>方案探索

    Java時間戳的使用

    Java時間戳的使用
    的頭像 發(fā)表于 11-06 16:04 ?375次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>時間戳的使用

    Lua語法基礎(chǔ)教程(下篇)

    今天我們繼續(xù)學(xué)習(xí)Lua語法基礎(chǔ)教程,下篇。 九、函數(shù) 9.1 初識函數(shù) 函數(shù)是指一段在一起的、可以做某一件事兒的程序,也叫做子程序。 在前面的內(nèi)容,我們已經(jīng)接觸過了函數(shù)的調(diào)用,這個函數(shù)就是前面用到
    的頭像 發(fā)表于 10-26 11:41 ?477次閱讀
    <b class='flag-5'>Lua</b>語法基礎(chǔ)教程(下篇)

    Lua語法基礎(chǔ)教程(中篇)

    今天我們繼續(xù)學(xué)習(xí)Lua語法基礎(chǔ)教程,中篇。 五、變量 5.1 number變量 變量,可以看作是一個桶,在里面裝你想要裝的內(nèi)容。這些內(nèi)容可以是Lua包含的所有合法類型。 例如:我想要新建一個桶,名叫
    的頭像 發(fā)表于 10-26 11:39 ?470次閱讀
    <b class='flag-5'>Lua</b>語法基礎(chǔ)教程(中篇)

    怎么JAVA確定線性池大小

    JAVA確定線性池大小,分別介紹CPU密集型任務(wù)和I/O密集型任務(wù)及其處理方法
    的頭像 發(fā)表于 10-24 14:02 ?342次閱讀

    Lua語法基礎(chǔ)教程(上篇)

    意味著Lua虛擬機可以很方便的嵌入別的程序里,從而為應(yīng)用程序提供靈活的擴展和定制功能。而整個Lua虛擬機編譯后僅僅一百余K,經(jīng)過適當?shù)牟眉暨€能做到更小,十分適合嵌入式的開發(fā)。 同時,目前腳本引擎
    的頭像 發(fā)表于 10-24 07:17 ?500次閱讀

    【龍芯2K0300蜂鳥板試用】+3.移植lua到loongarch

    1.Lua簡介 Lua 是一種輕量小巧的腳本語言,用標準C語言編寫并以源代碼形式開放,其設(shè)計目的是為了嵌入應(yīng)用程序,從而為應(yīng)用程序提供靈活的擴展和定制功能。 Lua 是巴西里約熱內(nèi)盧
    發(fā)表于 08-18 03:31

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    的平臺,Java可以用于開發(fā)桌面應(yīng)用程序、移動應(yīng)用程序、企業(yè)級應(yīng)用程序等。 – Java Web是Java語言Web開發(fā)領(lǐng)域的應(yīng)用,它使用Java
    的頭像 發(fā)表于 07-16 13:35 ?1181次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別

    CMD調(diào)用spiffsgen可以正常工作生成bin,pycharm調(diào)用不了spiffsgen怎么解決?

    spiffsgen.main() 這樣執(zhí)行后, 報錯信息是 error: the following arguments are required: image_size, base_dir, output_file CMD
    發(fā)表于 06-20 06:53

    已經(jīng)安裝了Java,且依然提示安裝Java是為什么?

    我已經(jīng)機器上安裝了最新版的 Java 10,打開 Cube 卻得到要求安裝 Java 1.7.0_45 的提示。何解?Eclipse CDT 依賴 Java,不可卸載重裝。
    發(fā)表于 04-26 06:23
    主站蜘蛛池模板: 无限资源在线完整高清观看1 | 天天国产在线精品亚洲 | 亚洲精品免费网站 | 暗卫受被肉到失禁各种PLAY | 中文字幕无码亚洲字幕成A人蜜桃 | 国产午夜永久福利视频在线观看 | 一个人在线观看视频免费 | 动漫美女3d被爆漫画 | 琪琪午夜福利免费院 | 动态抽插图视频 | 亚洲国产综合久久久无码色伦 | 一区二区三区高清视频 | 中国老太婆xxxxx | 免费久久狼人香蕉网 | 美女厕所撒尿ass | 调教日本美女 | 国产婷婷午夜无码A片 | 天美麻豆成人AV精品视频 | 久久毛片视频 | 交换年轻夫妇HD中文字幕 | 美女尿口羞羞视频 | 暖暖免费 高清 日本社区中文 | 城中村快餐嫖老妇对白 | 久久久精品成人免费看 | 51成人精品午夜福利AV免费七 | 伊人久久综合热青草 | 亚洲AV久久久噜噜噜久久 | 国产精品无码无卡毛片不卡视 | 久久精品国产免费中文 | 丝瓜视频樱桃视频在线观看免费 | 龙岩综合频道 | 久久国产精品二区99 | 亚洲精品国产国语 | 娇小XXXXX第一次出血 | 亚洲精品色婷婷在线蜜芽 | 亚洲综合日韩中文字幕v在线 | 青柠在线电影高清免费观看 | 成人在线视频观看 | jizz国产丝袜18老师美女 | 免费三级黄色 | 果冻传媒2021一二三在线观看 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品