安卓JAVA调用lua_android中java与lua的相互调用
Android Studio Lua環境配置
開發環境
1. Android Studio 3.5
2. java sdk: 1.8.0
3.android sdk:28
配置環境
添加lua支持語法支持插件,打開android studio -> File -> Settings
三方庫選擇
參考文章:https://gameinstitute.qq.com/community/detail/117865
Luaj 純Java實現的Lua解析器,無需使用native
首先切換到Project目錄,在gradle構建工具中添加依賴Luaj,然后同步
Java調用Lua函數
在main目錄下新建assets資源目錄文件夾,在其下存放lua文件
test.lua
luaV1 = "lua String"
function luaFun1()
print("Lua 無參無返回值方法");
end
function luaFun2(str)
return "來自Java的參數:"..str;
end
JavaTest.java
@Test
public void test1( ) {
Globals globals = JsePlatform.standardGlobals();
//加載Java腳本文件并編譯Lua腳本
globals.loadfile("src/main/assets/test.lua").call();
//加載Lua常量
LuaValue luaStr = globals.get(LuaValue.valueOf("luaV1"));
System.out.println("來自Lua的字符串" + luaStr.toString());
//加載無參無返回值函數
LuaValue lua1 = globals.get(LuaValue.valueOf("luaFun1"));
lua1.call();
//加載有參有返回值函數
LuaValue lua2 = globals.get(LuaValue.valueOf("luaFun2"));
//傳入參數
LuaValue str = lua2.call(LuaValue.valueOf("Java~"));
System.out.println(str.tostring());
}
運行測試方法test1輸出
來自Lua的字符串lua String
Lua 無參無返回值方法
來自Java的參數:Java~
Lua調用Java
Utils.java
public void javaFun1(String str){
System.out.println("Java + " + str);
}
public static void javaStaticFun1(String str){
System.out.println("Static Java +" + str);
}
test.lua
function luaFun3()
--創建java對象
fun1 = luajava.newInstance("com.example.luaandroid.Utils");
fun1:javaFun1("Lua");
end
function luaFun4()
--綁定Java類
fun1 = luajava.bindClass("com.example.luaandroid.Utils");
fun1:javaStaticFun1("Lua");
end
JavaTest.java
@Test
public void test2(){
Globals globals = JsePlatform.standardGlobals();
//加載Java腳本文件并編譯Lua腳本
globals.loadfile("src/main/assets/test.lua").call();
LuaValue lua1 = globals.get(LuaValue.valueOf("luaFun3"));
lua1.call();
}
運行測試方法test2輸出:
Java + Lua
Static Java +Lua
Lua與Java運算速度對比
test.lua
function test()
a = 0;
for i = 0, 1000000, 1 do
a = a + i;
end
return "over";
end
JavaTest.java
@Test
public void test(){
long l = System.currentTimeMillis();
int a = 0;
for (int i = 0; i < 1000000; i++) {
a += i;
}
System.out.println("Java : "+ (System.currentTimeMillis() - l));
Globals globals = JsePlatform.standardGlobals();
//加載Java腳本文件并編譯Lua腳本
globals.loadfile("src/main/assets/test.lua").call();
LuaValue lua1 = globals.get(LuaValue.valueOf("test"));
l = System.currentTimeMillis();
lua1.call().tostring();
System.out.println("Lua:"+ (System.currentTimeMillis() - l));
}
輸出結果:
Java : 7
Lua:518
在不加Lua腳本加載的時間,多次測試,大概計算速度相差五十倍左右
LuaJava 這個沒找到具體的庫~~
Android-Lua GitHub地址:https://github.com/liangchenhe55/Android-Lua
引入庫:
implementation group: 'com.blakequ.luajava', name: 'luajava', version: '1.0'
基本使用方法
Java調用Lua函數
MainActivity.java
//應用啟動之后獲取LuaState
mLuaState = LuaStateFactory.newLuaState();
mLuaState.openLibs();
//通過上下文返回lua腳本
mLuaState.LdoString(readAssetsTxt(this, "test.lua"));
//加載lua函數
mLuaState.getGlobal("luaFun1");
//傳入參數
mLuaState.pushString("lua");
//第一個參數表示傳入參數個數,第二個表示返回參數個數
mLuaState.call(1, 1);
//獲取返回值
mLuaState.toString(-1);
test.lua
function luaFun1(str)
return str;
end
Lua中引用Java的方法
Java的方法需要是繼承至JavaFunction()方法的,并重寫構造函數和execute()以及register()方法
構造方法用于傳入LuaState對象
execute()方法是想傳入方法
register()為想生成的Lua函數取名
具體實現看后面的實例
Android中Lua應用
XMl文件配置
activity_main.xml
MyJavaFunction.java (注入Lua腳本中的方法一)
public class MyJavaFunction extends JavaFunction {
public MyJavaFunction(LuaState luaState) {
super(luaState);
}
@Override
public int execute() {
// 獲取棧中Lua傳入的參數,注意第一個參數固定為上下文環境。
String str = L.toString(2);
L.pushString("Java的數據 + Lua的Str:"+str);
return 1; // 返回值的個數
}
@Override
public void register(String name){
try {
// 注冊為 Lua 全局函數
super.register("testJava");
} catch (Exception e) {
e.printStackTrace();
}
}
}
AsyncJavaFunction.java(注入Lua腳本中的Java方法二)
public class AsyncJavaFunction extends JavaFunction {
// lua 回調函數
// lua callback function
private LuaObject callbackFun;
public AsyncJavaFunction(LuaState L) {
super(L);
}
@Override
public int execute() {
// 獲取Lua傳入的參數,注意第一個參數固定為上下文環境。
if (L.isFunction(2)) {
callbackFun = L.getLuaObject(2);
new MyAsync().execute();
}
return 0;
}
void register() {
try {
// 注冊為 Lua 全局函數
register("http");
} catch (LuaException e) {
e.printStackTrace();
}
}
class MyAsync extends AsyncTask{
long t;
@Override
protected void onPreExecute() {
super.onPreExecute();
t = System.currentTimeMillis();
}
@Override
protected Integer doInBackground(Integer... integers) {
try {
// 模擬耗時操作(例如網絡請求)
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if (callbackFun != null) {
try {
// 2個參數,0 個返回值。
callbackFun.call(new Object[]{"OK", System.currentTimeMillis() - t}, 0);
} catch (LuaException e) {
e.printStackTrace();
}
}
}
}
}
test.lua
function luaFun1(str)
return testJava(str);
end
function luaCallback(tv)
-- http 函數是由 java `AsyncJavaFunction` 類注入的
-- http function was injected by java `AsyncJavaFunction`
http(function(result, time)
tv:setText(string.format("result: %s\ntime: %dms", result, time));
end
)
end
MainActivity.java (主程序文件)
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private LuaState mLuaState;
private Button mButton;
private Button mButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定控件
mTextView = findViewById(R.id.textView);
mButton = findViewById(R.id.button);
mButton2 = findViewById(R.id.button2);
//應用啟動之后獲取LuaState
mLuaState = LuaStateFactory.newLuaState();
mLuaState.openLibs();
//通過上下文返回lua腳本
mLuaState.LdoString(readAssetsTxt(this, "test.lua"));
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//利用Java函數生成lua函數,設置函數名為testJava
new MyJavaFunction(mLuaState).register("testJava");
//加載lua函數
mLuaState.getGlobal("luaFun1");
//傳入參數
mLuaState.pushString("test");
//第一個參數表示傳入參數個數,第二個表示返回參數個數
mLuaState.call(1, 1);
mTextView.setText(mLuaState.toString(-1));
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTextView.setText("Loading...");
new AsyncJavaFunction(mLuaState).register();
mLuaState.getGlobal("luaCallback");
mLuaState.pushJavaObject(mTextView);
mLuaState.call(1, 0);
}
});
}
public static String readAssetsTxt(Context context, String fileName) {
try {
InputStream is = context.getAssets().open(fileName);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String text = new String(buffer, "utf-8");
return text;
} catch (IOException e) {
e.printStackTrace();
}
return "err";
}
@Override
protected void onDestroy() {
//關閉lua棧
mLuaState.close();
super.onDestroy();
}
}
總結
以上是生活随笔為你收集整理的安卓JAVA调用lua_android中java与lua的相互调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java请求注释_求达人给java代码【
- 下一篇: 吉林大学超星学习通02(2)