cocos2d-x lua与jni层互调记录

原创 2016年08月29日 10:54:28

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()

Lua脚本接入Android使用JNI调用本地接口,需要注意的问题

Lua脚本接入Android使用JNI调用本地接口,需要注意的问题通常android的平台接入需要使用jni来接入java接口,应该注意以下几点问题:java接口要是静态,并且是public类型 //...
  • pklll000pp44
  • pklll000pp44
  • 2016年03月28日 14:05
  • 787

cocos2d-x中有一个JniHelper类详细使用

主体思路 通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息...
  • luxiaoyu_sdc
  • luxiaoyu_sdc
  • 2013年11月13日 18:58
  • 26240

Lua脚本接入Android使用JNI调用本地接口,需要注意的问题

Lua脚本接入Android使用JNI调用本地接口,需要注意的问题通常android的平台接入需要使用jni来接入java接口,应该注意以下几点问题:java接口要是静态,并且是public类型 //...
  • pklll000pp44
  • pklll000pp44
  • 2016年03月28日 14:05
  • 787

cocos lua 实现原声语音 流程概述

由于游戏需要,在cocos里面集成了自己原声的语音系统。虽然做的过程踩了很多的坑,并且过程很痛苦。这个过程需要你去了解很多的东西。 我是直接使用的lua 调用C++,c++在通过jni 调用安卓jav...
  • u011488256
  • u011488256
  • 2016年08月26日 17:15
  • 2582

Cocos2d-x与Android利用JNI相互调用

Cocos与Android利用JNI相互调用
  • sgn132
  • sgn132
  • 2016年01月22日 11:15
  • 1475

通过jni实现c++和java互调

1、java调用c++ 首先,在java中声明相关方法 public static native void doLogin(String sid); public static native...
  • somestill
  • somestill
  • 2015年03月17日 18:53
  • 2737

cocos2d-x中通过jni调用android方法

最近的一个Cocos项目有使用到JNI,结果又是通过百度来查找使用方法,为了方便以后查看,在这里小结一下,个人觉得应该会比较适合初次使用Jni的小伙伴们^_^ ——————————————正...
  • jegeg
  • jegeg
  • 2014年10月04日 17:28
  • 738

cocos2d-x中有一个JniHelper类详细使用

主体思路 通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息...
  • luxiaoyu_sdc
  • luxiaoyu_sdc
  • 2013年11月13日 18:58
  • 26240

关于cocos2dx如何通过jni进行c++与java的交互

参考博文:http://codingnow.cn/cocos2d-x/992.html 我们都知道,cocosd2dx的跨平台的游戏引擎,就是一处编写,多平台运行(一般就是用一种语言...
  • Mr_xin321
  • Mr_xin321
  • 2015年07月25日 11:31
  • 1822

Lua 与java 互调

首先用 cocos code ide 编写lua 代码 用 adt 编写 java 代码,只要修改了java代码,就必须用adt重新部署一次,再用ide运行runtime就有效果,否则看不到修改ja...
  • yangxuan0261
  • yangxuan0261
  • 2014年06月12日 23:55
  • 4810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x lua与jni层互调记录
举报原因:
原因补充:

(最多只允许输入30个字)