「java调用luaj」Java调用父类方法

博主:adminadmin 2022-12-01 11:53:08 68

今天给各位分享java调用luaj的知识,其中也会对Java调用父类方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

真机调试遇到的问题,Luajavabridge相关,求助

package com.benny.game.luajavabridgedemo;

import org.cocos2dx.lib.Cocos2dxActivity;

import android.os.Bundle;

public class Luajavabridgedemo extends Cocos2dxActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

static {

System.loadLibrary("game");

}

static public int addTowNumber(final int number1,final int number2)

{

return number1+number2;

}

}

--------------------------lua------------------------

function MainScene:ctor()

local __item = ui.newTTFLabelMenuItem({

text = "this is luajavabridge test",

size = 32,

x = display.cx,

y = display.cy,

align = ui.TEXT_ALIGN_CENTER,

listener = function()

if device.platform ~= "android" then

print("please run this on android device")

return

end

self:luajTest()

end

})

self:addChild(ui.newMenu({__item}))

end

function MainScene:luajTest()

local __javaClassName = "com/benny/game/Luajavabridgedemo"

local __javaMethodName = "addTowNumber"

local __javaParams = {1,2}

-- local __javaMethodSig = "(II)I"

luaj.callStaticMethod(__javaClassName, __javaMethodName, __javaParams)

end

local __javaClassName = "com/benny/game/luajavabridgedemo/Luajavabridgedemo"

你这个写错了 写掉一个目录

cocos2d Android调用Lua回调函数失败

花姑子《爱歌和鸣》:一日夫妻,岂止百日恩。看那迷雾,那寒星,那高山,那莽林,管它路转峰回山阻水隔,自有那身身相许的拳拳心。滴水之恩,何止报之涌泉,听那长嚎,那呻吟,那凄泣,那悲鸣,管它情天苍苍恨海茫茫,自有那与共生死的殷殷情。啊,剪不断,啊,理还乱,因为心的许、情的与,除了花前月下闺中唱酬,也会有刀风剑雨,乱红摧折悲落英。啊,只要灵犀一点,又何论人神仙妖、狐鬼精灵。拨动心的弓弦、情的丝竹,且听那人神共泣的爱歌和鸣。

lua和java有关系吗

ava和lua之间进行交互,可是用一种基于jni的luajavaBridge方法,目前已经集成在quick-cocos引擎中了。

luaj的功能整理:

1.lua能够查找java的方法;

2.lua能够把函数作为参数传入到java;

3.lua能够从java获得查找调用方法的返回值;

4.java能够调用lua的函数;

如何在Java中使用Lua脚本语言

如何在Java中使用Lua脚本语言是本文要介绍的内容,主要是来学习LUA脚本语言在JAVA中如何来使用,Lua就不说了, 现在比较热门, 语法也很简单. 为了在Java中调用, 折腾了比较长的时间, 就把一些东西记在下面.来看详细内容讲解。

Lua是支持内嵌在C程序中的, 但是官方不支持Java. 在网上查了下, 有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中加上这个函数的实现,

JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger (JNIEnv * env, jobject jobj, jobject cptr, jint i) { lua_State * L = getStateFromCPtr( env , cptr ); 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函数/取得返回值 就没有. 参考了 的Lua C文档, 实现了传递对象到Lua中并取得返回值的代码:

Test1: 测试传递简单类型, 并取得返回值:

Lua 脚本(test.lua):

function test(a,b) return a+b end

Java代码:

static { //加载Lua5.1.dll, 因为LuaJava最后还是要调用Lua的东西 System.loadLibrary("lua5.1"); } public static void main(String[] argu) throws LuaException { LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); //读入Lua脚本 int error = L.LdoFile("test.lua"); if (error != 0) { System.out.println("Read/Parse lua file error. Exit."); return; } //找到函数test L.getField(LuaState.LUA_GLOBALSINDEX, "test"); //参数1压栈 L.pushInteger(1); //参数2压栈 L.pushInteger(2); //调用!! 一共两个参数, 1个返回值 L.call(2, 1); //保存返回值, 到a中 L.setField(LuaState.LUA_GLOBALSINDEX, "a"); //读入a LuaObject l = L.getLuaObject("a"); //打印结果. System.out.println("Result is " + l.getString()); L.close(); }

测试2: 传递Java对象

class Value { public int i; public void inc() { i++; } public int get() { return i; } public String toString() { return "Value is " + i; } }

Lua脚本: (该脚本中调用两次对象的inc方法, 并调用get方法输出结果)

function test1(v) v:inc(); v:inc(); print("In lua: " .. v:get()); return v end

Java 代码: (前面都一样, 略)

//找到函数test1 L.getField(LuaState.LUA_GLOBALSINDEX, "test1"); //生成新的对象供测试 Value v = new Value(); //对象压栈 L.pushObjectValue(v); //调用函数test1, 此时1个参数, 1个返回值 L.call(1, 1); //结果放在b中. L.setField(LuaState.LUA_GLOBALSINDEX, "b"); LuaObject l = L.getLuaObject("b"); System.out.println("Result is " + l.getObject());

运行结果:

Result is Value is 2 In lua: 2

和预期的一致.

实现一个怪物的创建,把lua里的设定当作初始状态传给monstor,名字为sample monstor,防御10,攻击10,生命100

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

import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFactory; public class Load{ LuaState luaState; /** * Constructor * @param fileName File name with Lua . */ Load(final String fileName) { this.luaState = LuaStateFactory.newLuaState(); this.luaState.openLibs(); this.luaState.LdoFile(fileName); } /** * Ends the use of Lua environment. */ void close() { this.luaState.close(); } /** * Call a Lua inside the Lua to insert * data into a Java object passed as parameter * @param Name Name of Lua . * @param obj A Java object. */ void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1,0); } } public class Monster{ /* Info */ protected String race; protected int defense; protected int attack; protected int life; /* */ private Load ; public Monster(String race) { /* Loads Lua for this race.*/ this. = new Load(race+".lua"); /*Call Lua create .*/ .run("create", this); } public void setRace(String race) { this.race = race; } public String getRace() { return race; } public int getDefense() { return this.defense; } public void setDefense(int defense) { this.defense = defense; } public int getLife() { return this.life; } public void setLife(int life) { this.life = life; } public void setAttack(int attack) { this.attack = attack; } public int getAttack() { return this.attack; } } monstor.lua--- create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) end

但总是抛出这个错误:

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

不知为何,以后用到的时候再research.

已经查出来,原来在Monster类中少了个方法:

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

怪不得会找不到,

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

如果要从lua中运算后得到返回参数,则需要做一下修改:在lua文件中改成:

create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) return monster end

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

void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1, 1);// 一个参数,0个返回 try { Object object =luaState.getObjectFromUserdata(1); } catch (LuaException e) { e.printStackTrace(); } }

转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

cocos2dx-3.7版本lua程序入口在哪

一、主要分为两个大步骤,Lua工程的修改,android工程的修改

二、工程环境

开发工具:Cocos-Code-IDE

Lua版本 : Lua 5.1

java版本:1.7

NDK版本:android-ndk-r10c

ANT版本:apache-ant-1.9.4

Framwork:cocos-2dx-3.4

python : 2.7.3

三、Lua工程中的修改

1.在Cocos-Code-IDE中新建Lua工程

可以在这个工程目录中找到Luaj:

2.新建一个lua类,写上调用android的方法。

我在src/app/models/下面新建了一个Lua文件,命名为:luajTest.lua

其中代码如下:

local luaj = require "cocos.cocos2d.luaj" --引入luaj

local luajTest = class("luajTest") -- 构建lua 类

function luajTest:callandroid() --调用android的方法实现

--包名/类名 这个可以在对应的android工程的manifest中得到

local className="org/cocos2dx/lua/AppActivity"

local args = { "hello android", callbackLua }

local sigs = "(Ljava/lang/String;I)V" --传入string参数,无返回值

--luaj 调用 Java 方法时,可能会出现各种错误,因此 luaj 提供了一种机制让 Lua 调用代码可以确定 Java 方法是否成功调用。

--luaj.callStaticMethod() 会返回两个值

--当成功时,第一个值为 true,第二个值是 Java 方法的返回值(如果有)

--当失败时,第一个值为 false,第二个值是错误代码

local ok,ret = luaj.callStaticMethod(className,"test",args,sigs)

if not ok then

item:setString(ok.."error:"..ret)

end

end

return luajTest123456789101112131415161718192021222324

3.在入口场景中调用android方法。

我修改了src/app/views/MainScene.lua的场景跳转方法,如下:

local MainScene = class("MainScene", cc.load("mvc").ViewBase)

local testluaj = require('src.app.models.luajTest')--引入luajTest类

function MainScene:onCreate()

-- add background image

display.newSprite("MainSceneBg.jpg")

:move(display.center)

:addTo(self)

-- add play button

local playButton = cc.MenuItemImage:create("PlayButton.png", "PlayButton.png")

:onClicked(function()

self:getApp():enterScene("PlayScene") --跳转了一个场景

--在这里尝试调用android static代码

local testluajobj = testluaj.new(self)

testluajobj.callandroid(self);

end)

cc.Menu:create(playButton)

:move(display.cx, display.cy - 200)

:addTo(self)

end

return MainScene1234567891011121314151617181920212223242526272829

4.以上为Lua工程中的修改。

四、android工程的修改

1.找到相对应的android工程的。

Lua工程通过Runtime构建的android工程在Lua工程\framewokes\runtime-src\proj.android中。

2.根据luajTest.lua类中定义的包名类名,找到AppActivity.java

3.打开AppActivity.java,在空白处加上uajTest.lua类中定义要调用的方法test.

public static void test(final String param,final int luaFunc) {

System.out.println("----传过来的参数----param:"+param);

System.out.println("-------luaFunc:"+luaFunc);

/**

* 给lua返回一个字符串

*/

Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunc, "success");

/**

* 移除luaId

*/

Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFunc);

}

1234567891011121314

记得在文件上面引入Cocos2dxLuaJavaBridge类。

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;1

4.到此,修改完成。构建apk,安装到手机中,看Log.

如果看到以下Log,证明你的Luaj成功调用了java代码了。

关于java调用luaj和Java调用父类方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-01,除非注明,否则均为首码项目网原创文章,转载请注明出处。