关闭

cocos2d-x lua与jni层互调记录

554人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4152次
    • 积分:92
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论