cocos2d-x lua与jni层互调记录

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)

lua  创建json代码:

local params = json.encode()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值