如题所述
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 è¿ä¸ªå½æ°ã
ï¼1ï¼.ä¸è½½LuaJavaçæºä»£ç , æ¥çäºä¸Luajava.c å Luajava.h, åç°æç¶éé¢æç¹é®é¢, å¨.héé¢å®ä¹äºJNIä¸å¯¹åºJavaå½æ°çCå½æ°
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
ä½æ¯.cä¸æ²¡æå®ç°è¿ä¸ªå½æ°. æ è¯, çæ¥å¤§é©¬èåªé½æå. 幸äºææºä»£ç , ç
§ç«ç»èå¨Luajava.cä¸å ä¸è¿ä¸ªå½æ°çå®ç°,
ï¼2ï¼.ç¶åç¼è¯. ç¼è¯ä¹åºç°äºé®é¢äº, å®æ¹ææ¡£ä¸è¯´å¯ä»¥ç¨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):
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 代ç : (åé¢é½ä¸æ ·, ç¥)
//æ¾å°å½æ°est1
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
åé¢æçä¸è´.