cocos2d-x lua与jni层互调记录
本文章用于自己的实现流程记录和代码记录,不喜勿喷。
lua
因为cocos-lua 是无法与Java直接互调的,所以需要c++层作为中间层来实现互调。
lua与c++的绑定请看http://blog.csdn.net/cwhy7/article/details/52222140
接下来就是 c++调用Java,这里使用到jni层。
在proj.android文件夹下的src的AppActivity.java的位置,新建一个TestH.java
package org.cocos2dx.lua;
import java.util.logging.Logger;
public class TestH {
static {
Logger log = Logger.getLogger("lavasoft");
log.info("say");
}
public static int showName(String name){
String myName=name+",hello!";
Logger log = Logger.getLogger("a");
log.info("FKsay"+myName);
int sum=getSum(2);
Logger log1 = Logger.getLogger("a");
log1.info("sum="+sum);
return sum;
//System.out.print("say:");
}
public static native int getSum(int num);
}
static{}的方法在运行时会直接调用,是为了检测该Java文件是否被加载到。
public static int showName(String name) 这里定义了一个静态方法,c++将会调用这个方法。
public static native int getSum(int num); 这个方法是调用c++的方法,在showName()中用作返回值。
总的来说,就是从c++ 调用Java的showName(),showName()中调用c++的getSum(),这样来实现互调。
接下来就是c++的文件,在proj.android文件下的hellolua文件夹下创建test.cpp和test.h
test.cpp
#include "cocos2d.h"
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "test.h"
#define CLASS_NAME "org/cocos2dx/lua/TestH"
using namespace cocos2d;
extern "C"
{
int showName(const char *name)
{
JniMethodInfo t;
jint number=0;
if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "showName", "(Ljava/lang/String;)I"))
{
jstring jTitle = t.env->NewStringUTF(name);
number=t.env->CallStaticIntMethod(t.classID, t.methodID, jTitle);
t.env->DeleteLocalRef(jTitle);
}
return number;
}
int Java_org_cocos2dx_lua_TestH_getSum(JNIEnv* env,jobject thiz,jint num){
num++;
return num;
}
}
test.h
#ifndef TEST_H
#define TEST_H
extern "C"
{
int showName(const char *name);
int getSum(int num);
}
#endif
因为test.cpp是用于jni层互调,所以要在建一个cpp文件用于lua与c++的互调,就是lua--》cpp--》cpp--》Java。
在test.cpp同文件夹下,创建一个bind.cpp和bind.h
bind.cpp
#include "bind.h"
#include "cocos2d.h"
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "test.h"
int showNa(lua_State *pL){
const char *Name = lua_tostring(pL, 1);
int number=showName(Name);
lua_pushnumber(pL,number);
return 1;
}
bind.h
#ifndef bind_H
#define bind_H
#include "cocos2d.h"
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};
using namespace cocos2d;
int showNa(lua_State *pL);
#endif
然后修改jni文件下的Android.mk文件
在LOCAL_SRC_FILES:=/
.... 下加入
hellolua/test.cpp \
hellolua/bind.cpp \
接下来就是在frameworks/runtime-src/Classes/AppDelegate.cpp中注册函数,不了解请看上篇文章
#include "bind.h"
lua_State *pL = stack->getLuaState();
lua_register(pL, "showName", showNa);
这里要在Classes的文件夹下,把bind.h文件复制到这里,不然引用会报错。
接下来就是lua中调用
local c = showName("kangkang")
这样就可以调用到Java方法了,c的值为3。
lua toast方法代码
function Scene1:showToast(message,node)
local toastlabel = cc.LabelTTF:create(message,"Arial",30)
toastlabel:addTo(node)
toastlabel:setPosition(display.cx,display.cy/2-20)
toastlabel:setColor(cc.c3b(0, 255, 0))
local seq1 = cc.Sequence:create(cc.FadeIn:create(0.3),cc.DelayTime:create(1.5),cc.FadeOut:create(0),cc.CallFunc:create(function ()
-- -- body
toastlabel:removeSelf()
end))
toastlabel:runAction(seq1)
end
lua 进度条方法代码(简单使用,没什么卵用,凑合)
local to1 = cc.ProgressTo:create(0.1,100)
local left = cc.ProgressTimer:create(cc.Sprite:create("progress.jpg"))
-- 设置进度条类型,这里是条形进度类型
left:setType(cc.PROGRESS_TIMER_TYPE_BAR)
left:setMidpoint(cc.p(0, 0))
left:setBarChangeRate(cc.p(0.5, 0))
left:setPosition(display.cx, display.cy-160)
left:runAction(cc.RepeatForever:create(to1))
layer:addChild(left)