精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在Java中使用Lua腳本語言

移動開發 iOS
如何在Java中使用Lua腳本語言是本文要介紹的內容,主要是來學習LUA腳本語言在JAVA中如何來使用,Lua就不說了, 現在比較熱門,

如何在Java中使用Lua腳本語言是本文要介紹的內容,主要是來學習LUA腳本語言JAVA中如何來使用,Lua就不說了, 現在比較熱門, 語法也很簡單. 為了在Java中調用, 折騰了比較長的時間, 就把一些東西記在下面.來看詳細內容講解。

Lua是支持內嵌在C程序中的, 但是官方不支持Java. 在網上查了下, 有LuaJava開源庫, 拿來試用了一下, 發現這個庫還算比較完善的. 地址是

  1. http://www.keplerproject.org/luajava/ 

這個LuaJava實際上就是按照Lua官方文檔, 把Lua的C接口通過JNI包裝成Java的庫. 下載, 里面是一個.dll, 一個.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld運行OK.

但是, 測試的時候, 很快發現了第一個問題: 在調用LuaJava中提供的LuaState.pushInteger 方法的時候, 出現了錯誤 : Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是沒有問題. 用Depends工具看了下, 這個.dll居然沒有導出pushInteger這個函數. 暈....

下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然里面有點問題, 在.h里面定義了JNI中對應Java函數的C函數

JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger

但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,

  1. JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger  
  2.    (JNIEnv * env, jobject jobj, jobject cptr, jint i)  
  3. {  
  4.     lua_State * L = getStateFromCPtr( env , cptr );  
  5.     lua_pushinteger(L, i);  

然后編譯. 編譯也出現了問題了, 官方文檔中說可以用VC++來Build, 但是沒有說官方用的是什么版本. 我用VC2005就不行. 好在Luajava比較小, 就一個.h 一個 .c , 在VC中新建一個.dll項目, 把文件加進去, 修改一下build參數 (Include 需要加上lua的頭文件, lib中需要加上lua的.lib文件, 另外要選上 Compile as C Code (/TC) ) Build, 通過了.

這時再在Java中調用pushInteger方法就沒有問題了.

在測試中, 發現Luajava提供的文檔中, 對于Lua腳本怎么調用Java對象/方法很詳細, 但是在Java中怎么調用Lua函數/取得返回值 就沒有. 參考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction 的Lua C文檔, 實現了傳遞對象到Lua中并取得返回值的代碼:

Test1: 測試傳遞簡單類型, 并取得返回值:

Lua 腳本(test.lua):

  1. function test(a,b)  
  2.     return a+b  
  3. end 

Java代碼:

  1. static {  
  2.         //加載Lua5.1.dll, 因為LuaJava最后還是要調用Lua的東西  
  3.         System.loadLibrary("lua5.1");  
  4.     }  
  5.       
  6.     public static void main(String[] argu) throws LuaException {  
  7.           
  8.         LuaState L = LuaStateFactory.newLuaState();  
  9.  
  10.         L.openLibs();  
  11.  
  12.         //讀入Lua腳本  
  13.         int error = L.LdoFile("test.lua");  
  14.         if (error != 0) {  
  15.             System.out.println("Read/Parse lua file error. Exit.");  
  16.             return;  
  17.         }   
  18.           
  19.         //找到函數test  
  20.         L.getField(LuaState.LUA_GLOBALSINDEX, "test");  
  21.         //參數1壓棧  
  22.         L.pushInteger(1);  
  23.         //參數2壓棧  
  24.         L.pushInteger(2);  
  25.         //調用!! 一共兩個參數, 1個返回值  
  26.         L.call(2, 1);  
  27.         //保存返回值, 到a中  
  28.         L.setField(LuaState.LUA_GLOBALSINDEX, "a");  
  29.         //讀入a  
  30.         LuaObject l = L.getLuaObject("a");  
  31.         //打印結果.  
  32.         System.out.println("Result is " + l.getString());  
  33.         L.close();  

測試2: 傳遞Java對象

  1. class Value {  
  2.     public int i;  
  3.     public void inc() {  
  4.         i++;  
  5.     }  
  6.     public int get() {  
  7.         return i;  
  8.     }  
  9.     public String toString() {  
  10.         return "Value is " + i;  
  11.     }  

Lua腳本: (該腳本中調用兩次對象的inc方法, 并調用get方法輸出結果)

  1. function test1(v)  
  2.     v:inc();  
  3.     v:inc();  
  4.     print("In lua: " .. v:get());  
  5.     return v  
  6. end 

Java 代碼: (前面都一樣, 略)

  1. //找到函數test1  
  2. L.getField(LuaState.LUA_GLOBALSINDEX, "test1");  
  3. //生成新的對象供測試  
  4. Value v = new Value();  
  5. //對象壓棧  
  6. L.pushObjectValue(v);  
  7. //調用函數test1, 此時1個參數, 1個返回值  
  8. L.call(1, 1);  
  9. //結果放在b中.  
  10. L.setField(LuaState.LUA_GLOBALSINDEX, "b");  
  11. LuaObject l = L.getLuaObject("b");  
  12. System.out.println("Result is " + l.getObject()); 

運行結果:

  1. Result is Value is 2  
  2. In lua: 2 

和預期的一致.

實現一個怪物的創建,把lua里的設定當作初始狀態傳給monstor,名字為sample monstor,防御10,攻擊10,生命100

1.先導入lib--luajava-1.1.jar

  1. import org.keplerproject.luajava.LuaState;  
  2. import org.keplerproject.luajava.LuaStateFactory;  
  3.  
  4. public class Load{  
  5. LuaState luaState;  
  6. /**  
  7. * Constructor  
  8. * @param fileName File name with Lua .  
  9. */  
  10. Load(final String fileName) {  
  11. this.luaState = LuaStateFactory.newLuaState();  
  12.  
  13. this.luaState.openLibs();  
  14.    this.luaState.LdoFile(fileName);  
  15.  
  16. }  
  17. /**  
  18. * Ends the use of Lua environment.  
  19. */  
  20. void close() {  
  21. this.luaState.close();  
  22. }  
  23. /**  
  24. * Call a Lua inside the Lua to insert  
  25. * data into a Java object passed as parameter  
  26. * @param Name Name of Lua .  
  27. * @param obj A Java object.  
  28. */  
  29. void run(String Name, Object obj) {  
  30. this.luaState.getGlobal(Name);  
  31. this.luaState.pushJavaObject(obj);  
  32. this.luaState.call(1,0);  
  33. }  
  34. }  
  35.  
  36. public class Monster{  
  37. /* Info */  
  38. protected String race;  
  39. protected int defense;  
  40. protected int attack;  
  41. protected int life;  
  42. /* */  
  43. private Load ;  
  44. public Monster(String race) {  
  45. /* Loads Lua for this race.*/  
  46. this. = new Load(race+".lua");  
  47. /*Call Lua create .*/  
  48. .run("create", this);  
  49. }  
  50.  
  51. public void setRace(String race) {  
  52.    this.race = race;  
  53. }  
  54. public String getRace() {  
  55. return race;  
  56. }  
  57. public int getDefense() {  
  58. return this.defense;  
  59. }  
  60. public void setDefense(int defense) {  
  61. this.defense = defense;  
  62. }  
  63. public int getLife() {  
  64. return this.life;  
  65. }  
  66. public void setLife(int life) {  
  67. this.life = life;  
  68. }  
  69. public void setAttack(int attack) {  
  70. this.attack = attack;  
  71. }  
  72. public int getAttack() {  
  73. return this.attack;  
  74. }  
  75. }  
  76.  
  77. monstor.lua---  
  78.  
  79. create(monster)  
  80. monster:setRace("Sample Monster")  
  81. monster:setDefense(10)  
  82. monster:setAttack(10)  
  83. monster:setLife(100)  
  84. end 

但總是拋出這個錯誤:

  1. PANIC: unprotected error in call to Lua API (Invalid method call. No such method.) 

不知為何,以后用到的時候再research.

已經查出來,原來在Monster類中少了個方法:

  1. public void setRace(String race) {  
  2.    this.race = race;  

怪不得會找不到,

要在一lua文件a.lua里導入其他的lua文件b.lua,用require "b"

如果要從lua中運算后得到返回參數,則需要做一下修改:在lua文件中改成:

  1. create(monster)  
  2. monster:setRace("Sample Monster")  
  3. monster:setDefense(10)  
  4. monster:setAttack(10)  
  5. monster:setLife(100)  
  6. return monster  
  7. end 

在Load.java中的run改成如下:

  1. void run(String Name, Object obj) {  
  2.    this.luaState.getGlobal(Name);  
  3.    this.luaState.pushJavaObject(obj);  
  4.    this.luaState.call(1, 1);// 一個參數,0個返回   
  5.    try {  
  6.     Object object =luaState.getObjectFromUserdata(1);  
  7.    } catch (LuaException e) {  
  8.     e.printStackTrace();  
  9.    }  

小結:如何在Java中使用Lua腳本語言的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-23 09:56:52

UnicodeLua

2011-08-25 13:22:40

CEGUILua腳本

2011-08-23 09:44:28

LUA腳本

2011-09-07 09:51:27

Javascript

2010-07-01 09:29:15

Java腳本語言javax.scrip

2011-08-22 18:00:53

Lua語言

2011-08-22 16:59:28

Lua

2011-08-25 11:02:04

2011-08-25 10:40:21

Lua游戲

2011-08-22 17:41:23

LUA 腳本 語言

2011-08-22 18:08:09

Lua腳本

2022-11-23 08:14:42

bash 腳本test 命令

2011-08-24 13:32:17

2011-06-22 14:07:42

Lua

2021-03-14 09:28:24

Linux Shell腳本

2022-12-22 20:47:01

腳本循環結構

2022-10-09 10:18:44

LinuxShell腳本

2021-09-10 10:30:22

Java代碼

2023-04-04 07:52:26

RedisLua腳本

2023-01-28 17:41:07

Java代碼
點贊
收藏

51CTO技術棧公眾號

青草网在线观看| 国产精品亚洲片夜色在线| 国产精品91av| 涩涩网在线视频| 国产欧美日韩不卡| 91视频8mav| 全部毛片永久免费看| 久久激情电影| 亚洲高清av在线| 中文字幕第36页| 欧美伦理免费在线| 国产午夜精品福利| 成人动漫视频在线观看免费| 日韩在线视频不卡| 午夜天堂精品久久久久| 亚洲新中文字幕| 中文字幕在线观看91| av免费在线一区| 亚洲综合激情网| 亚洲va韩国va欧美va精四季| 99热这里只有精品在线| 亚洲欧美网站| 蜜臀久久99精品久久久无需会员| 内射中出日韩无国产剧情| 日本久久久久| 一本到高清视频免费精品| 手机在线视频你懂的| 桃花色综合影院| 国精产品一区一区三区mba桃花| 国产91精品久久久| 欧美一区二区三区爽爽爽| 久久99精品久久久久久园产越南| 精品久久久久久久久久久久久久久久久 | 中文字幕制服丝袜在线| 日韩一区av| 成人av网在线| 成人免费在线看片| 97在线公开视频| 日韩高清不卡一区二区三区| 69精品小视频| 久青草免费视频| 亚洲精品一二三区区别| 日韩中文字在线| 性猛交娇小69hd| 免费成人结看片| 日韩精品视频三区| xxxxxx黄色| 国产精品45p| 欧美大片在线观看| 日本wwww色| 亚州一区二区| 日韩欧美中文一区| 波多野结衣中文字幕在线播放| 久久亚洲国产精品尤物| 欧美色图12p| 美女网站视频黄色| 国产精品黄色片| 欧美视频一区二| 九九精品久久久| 激情综合五月| 日韩免费视频一区二区| 精品无码av一区二区三区| 99国产精品免费网站| 日韩欧美一区二区在线视频| 中文字幕永久免费| 国产成人精品福利| 日韩第一页在线| 无码一区二区三区在线| 精品久久综合| 久久久精品国产亚洲| 2018天天弄| 激情另类综合| 日本精品性网站在线观看| 中文字幕在线播| 蜜臀久久99精品久久久久久9| 国产精品视频久久久久| 国产伦一区二区| 大陆成人av片| 欧美一区1区三区3区公司 | 波多野结衣av无码| 另类小说综合欧美亚洲| 亚洲xxx视频| 污污网站在线免费观看| 久久亚洲精品国产精品紫薇| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲视频tv| 一区二区三区不卡在线观看| www国产精品内射老熟女| 欧美gay囗交囗交| 欧美日本视频在线| 日韩精品人妻中文字幕有码| 伊人久久大香线蕉av不卡| 精品国产欧美一区二区三区成人| 麻豆一区产品精品蜜桃的特点| 在线成人国产| 国产欧美精品一区二区三区-老狼| 国产成人a人亚洲精品无码| 99re免费视频精品全部| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲欧洲日韩精品在线| 精品电影一区二区| 中文字幕黄色网址| 在线日韩电影| 国产精品自产拍在线观| 日韩中文字幕观看| 国产精品久久久久久福利一牛影视| 欧美人成在线观看| 国产精品天堂蜜av在线播放| 亚洲精品动漫久久久久| 女同久久另类69精品国产| 99精品国产在热久久| 91免费看片网站| 精品av中文字幕在线毛片 | 国产成人亚洲综合无码| 欧美性suv| 精品精品欲导航| 一本一本久久a久久| 性8sex亚洲区入口| 电影午夜精品一区二区三区| 在线免费观看黄| 性久久久久久久久久久久| 亚洲制服中文字幕| av在线不卡顿| 欧美自拍大量在线观看| 欧美 日韩 国产 成人 在线| 136国产福利精品导航| 日本www.色| 久久av中文| 91av在线免费观看| 欧美熟妇另类久久久久久不卡 | 日韩av最新在线观看| xxxx日本少妇| 国产做a爰片久久毛片| 午夜精品区一区二区三| 欧美一区国产| 亚洲精品国精品久久99热| 久久久久成人片免费观看蜜芽| 精品一区二区影视| 亚洲欧洲精品在线| 精品国产美女a久久9999| 国产一区二区三区欧美| 亚洲欧美日韩一区二区三区四区| 97久久精品人人做人人爽| 欧美黑人在线观看| 麻豆一二三区精品蜜桃| 久久视频在线播放| 99精品免费观看| 亚洲精品视频在线看| 91大神免费观看| 欧美1区2区视频| 99精品国产一区二区| av香蕉成人| 日韩欧美亚洲另类制服综合在线 | 日韩偷拍自拍| 精品欧美aⅴ在线网站| 97香蕉碰碰人妻国产欧美| 激情久久久久久| 韩国一区二区三区美女美女秀| 51av在线| 国产丝袜精品视频| 亚洲午夜在线播放| 国产精品成人免费精品自在线观看| 天天干天天综合| 久久中文字幕av| 91视频免费网站| av网站导航在线观看免费| 日韩一区二区麻豆国产| 免费观看一级视频| 91一区一区三区| 999在线免费视频| 999久久久免费精品国产| 96国产粉嫩美女| 福利在线导航136| 亚洲美女视频网| 人妻中文字幕一区二区三区| 国产精品成人免费在线| 四虎精品一区二区| 性8sex亚洲区入口| 在线观看日本一区| 午夜免费欧美电影| 日产精品久久久一区二区福利| 国产毛片av在线| 日韩一区二区在线观看视频| 国产精品99精品| 久久一区二区视频| 国产成人美女视频| 亚洲乱码视频| 亚洲蜜桃av| gogo人体一区| 国产精品久久久久影院日本 | 4388成人网| 生活片a∨在线观看| 精品美女一区二区| 中文字幕福利视频| 亚洲一区二区在线观看视频 | 囯产精品久久久久久| 色呦呦国产精品| 亚洲av鲁丝一区二区三区| 久久久久久久久久美女| 色姑娘综合天天| 久久久久国产精品一区二区| 热久久最新网址| 国产精品视频一区二区三区四蜜臂| 成人综合国产精品| 欧美一级大黄| 欧美极品少妇xxxxⅹ喷水| xxxxx日韩| 亚洲第一免费网站| 国产区精品在线| 欧美影视一区在线| 亚洲午夜18毛片在线看| 亚洲视频免费观看| 欧美三级视频网站| 99re在线视频这里只有精品| 青娱乐国产精品视频| 蜜桃av一区二区在线观看 | 久久成人18免费观看| 国产91在线视频观看| 欧美日韩国产精品一区二区亚洲| 日韩视频精品| 婷婷综合电影| 国产精品免费一区二区| 57pao成人永久免费| 国产精品美乳在线观看| 超碰aⅴ人人做人人爽欧美| 久久免费视频网| 91精品久久久| 久久精品中文字幕| www.久久热.com| 亚洲色图偷窥自拍| 亚洲欧洲国产综合| 亚洲精品ady| 人妻视频一区二区三区| 欧美一级生活片| 国产免费黄色录像| 欧美精选在线播放| 亚洲无码久久久久| 欧美调教femdomvk| 午夜视频网站在线观看| 色综合激情久久| 97人妻一区二区精品视频| 日韩欧美国产一区二区| 欧美特黄aaaaaa| 日韩欧美黄色动漫| 亚洲欧美偷拍一区| 色婷婷综合视频在线观看| 国产剧情在线视频| 在线观看亚洲精品视频| 国产精品午夜一区二区| 日韩欧美在线看| 中文字幕一区二区人妻电影| 欧美日韩午夜剧场| 三级视频在线观看| 在线观看一区二区视频| 中文字幕一二三四| 欧美日韩精品是欧美日韩精品| 中文字幕在线观看第二页| 欧美日韩中文字幕一区二区| 亚洲天堂手机在线| 56国语精品自产拍在线观看| 国产丰满美女做爰| 亚洲二区中文字幕| 免费成人av电影| 在线a欧美视频| 老司机精品视频在线观看6| 久久精品国产91精品亚洲 | 亚洲一区二区三区中文字幕在线| 久草免费在线观看视频| 亚洲6080在线| 无码人妻一区二区三区免费| 欧美日韩久久一区二区| 国产美女主播在线观看| 亚洲激情第一页| 黄色在线播放| 久久深夜福利免费观看| 草草视频在线观看| 国产精品99久久久久久白浆小说| 欧美日韩免费电影| 国产精品国色综合久久| 国产不卡av一区二区| 99re99热| 国产精品毛片在线| 手机看片一级片| 成人中文字幕电影| 亚洲性猛交xxxx乱大交| 成人欧美一区二区三区白人 | 91国偷自产一区二区三区观看| 国产精品久久婷婷| 亚洲精品乱码久久久久久按摩观| 粉嫩av一区| 久久99久久亚洲国产| 欧美日韩视频免费观看| 亚洲最大成人网色| 国产精品探花在线观看| 日本国产中文字幕| 久久裸体视频| 美女露出粉嫩尿囗让男人桶| 久久夜色精品一区| 欧美人妻精品一区二区免费看| 欧美性猛交xxxx免费看久久久| 91午夜交换视频| 精品无人区太爽高潮在线播放| 国产三区视频在线观看| 欧美做受高潮电影o| 日韩一区二区三区高清在线观看| 日本一区网站| 亚洲九九精品| 色哟哟免费视频| 国产精品欧美久久久久无广告 | 欧美日本一区二区在线观看| 五月天久久久久久| 欧美精品免费看| 黄色精品视频网站| 久久五月天婷婷| 欧美日本三区| 911福利视频| 国产亚洲成av人在线观看导航| 精品在线视频免费| 欧美丰满高潮xxxx喷水动漫| 成人性爱视频在线观看| 97成人精品区在线播放| 538任你躁精品视频网免费| 人人妻人人澡人人爽精品欧美一区| 日韩经典一区二区| 国产国语性生话播放| 亚洲国产成人porn| 国产黄色一区二区| 久久中文精品视频| 中文字幕综合| 致1999电视剧免费观看策驰影院| 日韩福利视频导航| 中文字幕av网址| 欧美日韩精品中文字幕| 丰满人妻一区二区三区免费| 欧美成人精品在线观看| 爱情电影网av一区二区| 在线视频一区观看| 久久99国产精品久久| 日韩av毛片在线观看| 欧美精品vⅰdeose4hd| 嫩草在线视频| 91精品视频免费| 7777久久香蕉成人影院| 久久久精品高清| 国产精品福利在线播放| 一道本无吗一区| 久久精品电影网站| 欧美一区在线观看视频| av影院在线播放| 高清av一区二区| 91精品国产高潮对白| 亚洲国产精久久久久久| 黄视频网站在线观看| 久久亚洲国产精品日日av夜夜| 99热这里只有成人精品国产| 国产精品久久AV无码| 福利视频一区二区| 你懂的视频在线观看| 国产精品九九九| 欧美高清在线| 欧美高清精品一区二区| 亚洲五码中文字幕| 婷婷亚洲一区二区三区| 国产成人激情视频| 久久要要av| 少妇献身老头系列| 精品国产户外野外| 美国成人毛片| 成人精品福利视频| 极品少妇一区二区三区| 在线免费观看成年人视频| 91传媒视频在线播放| 午夜不卡视频| 北条麻妃高清一区| 亚洲永久网站| a级黄色免费视频| 精品国产第一区二区三区观看体验| 蜜桃视频动漫在线播放| 亚洲午夜久久久影院伊人| 岛国精品在线观看| 波多野结衣网站| 美女黄色丝袜一区| 日韩精品免费一区二区夜夜嗨 | 国产精品久久久影院| 99在线精品免费| 伊人久久国产精品| 欧美激情精品久久久久久黑人 | 高清不卡一二三区| 久久久精品毛片| 欧美寡妇偷汉性猛交| 在线成人动漫av| 中文字幕无码毛片免费看| 日韩欧美在线免费| 尤物在线网址| 丝袜美腿玉足3d专区一区| 成人综合在线观看| 在线免费观看av片| 欧日韩不卡在线视频| 欧美 日韩 国产一区二区在线视频| 熟女俱乐部一区二区视频在线|