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

相关文章推荐

cocos2d lua调用java LuaJavaBridge

我在网上看到了 LuaJavaBridge 的 使用方法这篇文章 https://segmentfault.com/a/1190000004252394?utm_source=tuicool&utm_...

【COCOS2DX-LUA 脚本开发之十三】解决Cocos2dx-Lua编译到Android找不到CCLuaEngine、HelloWorld或出现get data from file(xxx.lua

对于跨平台整合,Himi已经写了1.x 与 2.x 的了,还不知道如何整合的请移步到 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.x版本跨平台整合NDK+Xcode,X...

LuaJavaBridge - Lua 与 Java 互操作的简单解决方案

LuaJavaBridge - Lua 与 Java 互操作的简单解决方案 Table of Contents luaj 主要特征luaj 用法示例luaj 实现原理 查找并调用指定...

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

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

LuaJava:跟着LuaJava一步一步学习JNI -1

LuaJava:跟着LuaJava一步一步学习JNI -1

html弹出提示showtoast

1.引用jquery.js和showtoast.js 2.调用showtoast() 或者showsucess() 或者showfailure()
  • hejias
  • hejias
  • 2015年10月19日 11:19
  • 3169

【转】cocos2d-x 通过JNI实现c/c++和Android的java层函数互调

原文地址:http://codingnow.cn/cocos2d-x/992.html 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageNam...

cocos2d-x 通过JNI实现c/c++和Android的java层函数互调

文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函...

cocos2d-x 通过JNI实现c++和Android的java层函数互调

本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x lua与jni层互调记录
举报原因:
原因补充:

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