日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java + lua = 王炸!!

發布時間:2024/3/12 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java + lua = 王炸!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序員的成長之路

互聯網/程序員/技術/資料共享?

關注

閱讀本文大概需要 3.5?分鐘。

來自:https://blog.csdn.net/li15225271052/article/details/70148609

我們寫東西的時候總會遇到lua中要調用java代碼,當然這個用JNI肯定是可以做到的,但是有更加方便的辦法—LuaJavaBridge。

一、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 用法示例

Java?方法原型public?static?float?getNum(float?n)?{ return?n; }local?className?=?"com/qeeplay/frameworks/CheShi"local?method?=?'getDisplayWidth'local?n?=?10 local?args?=?{n }local?_,?screenwidth?=?luaj.callStaticMethod(className,?method,?args)

三、luaj 實現原理

luaj 的核心目標有兩個:從 Lua 調用 Java, 從 Java 調用 Lua。

整理出來就是如下幾點

*?查找并調用指定的?Java?方法 *?檢查調用結果,并從?Java?方法獲取返回值 *?將?Lua?function?作為參數傳遞給?Java?方法 *?在?Java?方法中調用?Lua?function

推薦一個開源免費的 Spring Boot 最全教程:

https://github.com/javastacks/spring-boot-best-practice

四、查找并調用指定的 Java 方法

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

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

所謂簽名,就是指Java方法的參數類型和返回類型定義。例如前面示例代碼中 GameInterface_doBilling() 方法的簽名是 (Ljava/lang/String;ZZI)V 。關于 Java 方法簽名的具體定義,可以參考:JNI Type Signatures。

這里要說的是 luaj 可以根據調用參數自動猜測方法簽名所以示例中我們并沒有寫簽名,示例中指定參數

local?args?=?{n}1

luaj 根據這 個參數,會構造出正確的方法簽名。

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

public?static?int?getNum(int?n)?{return?n; }local?className?=?"com/qeeplay/frameworks/CheShi"local?method?=?'getDisplayWidth'local?n?=?10 local?args?=?{n }local?_,?screenwidth?=?luaj.callStaticMethod(className,?method,?args)

這樣是不行的,所以這個時候我們要自己定義簽名,下面給出正確的示例

public?static?int?getNum(int?n)?{return?n; }local?className?=?"com/qeeplay/frameworks/CheShi"local?method?=?'getDisplayWidth'local?n?=?10 local?args?=?{n }local?sig?=?"(I)I"local?_,?screenwidth?=?luaj.callStaticMethod(className,?method,?args,sig)

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

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

這里列出不同類型對應的 Java 簽名字符串:

類型名?????????????????類型 I???????????????????????整數,或者?Lua?function F???????????????????????浮點數 Z???????????????????????布爾值 Ljava/lang/String;??????字符串 V???????????????????????Void?空,僅用于指定一個?Java?方法不返回任何值123456

Java 方法里接收 Lua function 的參數必須定義為 int 類型。

五、檢查調用結果,并從 Java 方法獲取返回值

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

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

*?當成功時,第一個值為?true,第二個值是 Java 方法的返回值(如果有)。 *?當失敗時,第一個值為?false,第二個值是錯誤代碼。

下面的代碼展示了如何檢查返回結果和獲得返回值。

java代碼

public?static?int?AddTwoNumbers(final?int?number1,?final?int?number2)?{return?number1?+?number2; }

Lua代碼

local?args?=?{2,?3} local?sig?=?"(II)I" local?ok,?ret?=?luaj.callStaticMethod(className,?"AddTwoNumbers",?args,?sig)if?not?ok?then print("luaj?error:",?ret) else print("ret:",?ret)? end

錯誤代碼定義如下:

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

六、將 Lua function 作為參數傳遞給 Java 方法

Lua 虛擬機中,Lua function 以值的形式保存。但這個值無法直接給 Java 用,所以 luaj 做了一個 Lua function 引用表。當一個 Lua function 傳遞給 Java 時,這個 function 對應的值會被存在引用表中,并獲得一個唯一的引用 ID (整數)。Java 代碼拿到這個引用 ID 后,就可以很方便的調用該 Lua function 了。

所以Java 方法里接收 Lua function 的參數必須定義為 int 類型,示例:

public?static?int?getNum(int?n)?{return?n; } local?function?callback(result)endlocal?className?=?"com/qeeplay/frameworks/CheShi"local?method?=?'getDisplayWidth'local?args?=?{callback }local?sig?=?"(I)I"local?_,?screenwidth?=?luaj.callStaticMethod(className,?method,?args,sig)


<END>

推薦閱讀:

SpringBoot 還在用 if 校驗參數?那你真的太low了,老司機都是這么玩的!

Spring Boot+JWT+Shiro+MyBatisPlus 實現 RESTful 快速開發后端腳手架!

互聯網初中高級大廠面試題(9個G) 內容包含Java基礎、JavaWeb、MySQL性能優化、JVM、鎖、百萬并發、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務、Zookeeper......等技術棧! ?戳閱讀原文領取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱

總結

以上是生活随笔為你收集整理的Java + lua = 王炸!!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男女互插视频 | 日韩精品一区二区三区四区五区 | 亚洲综合图片区 | 亚洲福利av | 免费国产精品视频 | 欧美日韩免费在线 | 欧美日韩一区二区三区在线视频 | 精品成人av一区二区在线播放 | 五月天国产视频 | 欧美亚洲精品在线 | 免费在线 | 亚洲av无码久久精品色欲 | 中文字幕久久av | 日韩视频在线免费观看 | 欧美色图一区二区 | 国产在线传媒 | 91亚洲精品久久久蜜桃 | av网址网站 | 精品成人一区 | 大学生三级中国dvd 日韩欧美一区二区区 | 色哟哟一区二区三区 | 免费看欧美一级特黄a大片 国产免费的av | 在线观看黄色网页 | jizzjizz视频| 国产精品人成在线观看免费 | 国产一区二区精彩视频 | 日韩中文字幕一区二区三区四区 | 欧美国产精品一二三 | 人成网站在线观看 | 日韩av网站在线播放 | 中文字幕自拍偷拍 | 久久国产中文字幕 | 日韩欧美在线一区 | 欧美群妇大交乱 | 伊人久久狼人 | 日韩高清精品免费观看 | 亚洲天堂少妇 | 黄色网址在线免费观看 | 久久国产精品久久 | 国产高清区 | 制服下的诱惑暮生 | 麻豆精品国产传媒av | 欧美天天射 | 午夜免费高清视频 | 国产精品久久久久久久一区二区 | 亚洲成a人v欧美综合天堂麻豆 | 亚洲三级在线看 | 青草精品视频 | 三度诱惑免费版电影在线观看 | 午夜av一区二区三区 | 公侵犯人妻中文字慕一区二区 | 9999视频| 超碰伊人久久 | 91精品国产综合久久久久久 | 福利在线一区二区 | 91中文字幕在线视频 | 禁漫天堂免费网站 | av免播放器| 桥本有菜aⅴ一区二区三区 在线午夜电影 | 欧美在线导航 | 性插免费视频 | 中文字幕 亚洲一区 | 国产综合在线观看视频 | 人妻一区二区三区 | 亚洲欧洲中文 | 久久水蜜桃 | 狼人伊人干 | 亚洲精品国产精品乱码不卡√香蕉 | 高清国产mv在线观看 | 亚洲午夜无码久久 | 国产高清视频免费在线观看 | 国产激情小视频 | 国产淫语 | 手机免费av | 久久亚洲av午夜福利精品一区 | 俄罗斯porn | 中文字幕在线看片 | 懂色av蜜臀av粉嫩av分 | 日韩专区中文字幕 | 樱花影院电视剧免费 | 亚洲人网| 桃花岛影院 | 亚洲日本精品一区 | 天天操夜夜添 | 乱子伦视频在线看 | 欧美大黄视频 | 国产乱码久久久 | 亚洲图片视频小说 | 69视频污 | 国产性―交一乱―色―情人 | 精品人妻大屁股白浆无码 | 色原网 | 特黄特色特刺激免费播放 | 亚洲精品乱码久久久久久蜜桃不卡 | 一区二区三区四区五区在线视频 | 日本三级黄在线观看 | aa黄色片 | 最污网站在线观看 | 河北彩花中文字幕 |