zoukankan      html  css  js  c++  java
  • 集成Lua到你的Android游戏 转

      当前众多游戏引入脚本语言作为快速发布内容以及灵活扩展的解决方案,在寻找向Android应用集成Lua脚本语言的方案时,大量零碎的资料并没有向开发者指引一个明确的方向。在这里我把自己通过整合资料完成的方案写下来,希望能给需要的程序员帮助,欢迎大家提供更快捷的方案。

      不再赘述Android开发环境的配置以及Lua脚本语言的介绍,需要了解的朋友可以Google资料。

      我的开发环境是Window,列举我们将要用到的工具和组件:

      简要介绍解决方案涉及到的几个基本概念,高手自动略过:

      Lua用C实现,所以如果我们不打算用Java重写解释器的话,我们需要一种方式使C和Java能良好的沟通,熟悉Java的程序员肯定想到了JNI(Java Native Interface)。你可能在Linux环境和Window环境使用过JNI,过程并不复杂:写好Java文件并在其中声明好native方法→用javah生成C头文件→为C文件中声明的函数写好实现→编译C代码生成动态链接库,这样就可以在Java中使用native方法了。在Android下我们同样要经过这些步骤,只不过编译生成动态链接库的时候我们需要Google提供的NDK工具。在Window环境下使用NDK还需要安装UNIX模拟环境Cygwin。我们还将用到一个对Lua进行良好封装的开源项目luajava。

      下面开始详细步骤:

    1. 安装Cygwin,下载到的setup是一个安装器,负责在线或者本地找到安装需要的文件并执行安装,建议把文件下载到本地以备下次使用,安装过程执行到选择安装包时一定确定All结点(树形结点的根结点)在Install状态以免需要的包不被安装,如果是在线安装时间会很长,耐心等待过后Cygwin安装成功。
    2. 安装NDK,NDK是一个压缩文件,下载完成解压缩(建议解压缩到一个方便输入路径的目录)。
    3. 下载上面lua和luajava的源代码并解压缩到任意目录。
    4. 在任意目录创建luajava4android(名字可以任意)目录,在目录下创建子目录jni(名字指定为jni),把lua和luajava中的C文件(包括头文件和源文件)都拷入该目录,并在该目录下创建Android.mk文件,拷贝下面内容至文件:
      LOCAL_PATH := $(call my-dir)
       
      include $(CLEAR_VARS)
       
      LOCAL_ARM_MODE  := arm
      LOCAL_MODULE    := luajava-1.1
      LOCAL_SRC_FILES := lapi.c \
          lauxlib.c \
          lbaselib.c \
          lcode.c \
          ldblib.c \
          ldebug.c \
          ldo.c \
          ldump.c \
          lfunc.c \
          lgc.c \
          linit.c \
          liolib.c \
          llex.c \
          lmathlib.c \
          lmem.c \
          loadlib.c \
          lobject.c \
          lopcodes.c \
          loslib.c \
          lparser.c \
          lstate.c \
          lstring.c \
          lstrlib.c \
          ltable.c \
          ltablib.c \
          ltm.c \
          lundump.c \
          lvm.c \
          lzio.c \
          print.c \
          luajava.c
       
      include $(BUILD_SHARED_LIBRARY)
    5. 运行Cygwin安装目录下的Cygwin.bat进入命令行界面,进入刚才建立的luajava4android路径,执行ndk-build,成功以后就会在目录下生成一个lib目录,里面以.so为后缀名的文件即为我们需要的动态链接库文件。
    6. 把luajava中的java源代码导入到自己的Android工程中,在工程目录下建立\libs\armeabi\结构的路径,并把动态链接库文件拷入,刷新工程,这样我们就完成了所有的步骤,并不复杂,可以写一个简单的实例来验证Lua环境是否搭建好了。
      package com.android.hello;
      
      import android.app.Activity;
      import android.os.Bundle;
      import android.widget.TextView;
      
      import org.keplerproject.luajava.*;
      
      publicclass HelloAndroidActivity extends Activity {
          /** Called when the activity is first created. */
          @Override
          publicvoid onCreate(Bundle savedInstanceState) {
              LuaState L = LuaStateFactory.newLuaState();
              L.openLibs();
              L.LdoString("text = 'Hello Android, I am Lua.'");
              L.getGlobal("text");
              String text = L.toString(-1);
              super.onCreate(savedInstanceState);
              TextView tv =new TextView(this);
              tv.setText(text);
              setContentView(tv);
          }
      }
      下面是运行结果图:

      到此Android下的Lua环境就配置好了,至于怎么运用就看各位程序员的设计了。

    ----原文:http://www.cnblogs.com/astin/archive/2011/07/26/2117590.html#top

    在看这篇文章之前,先确定你已经看完了原作者的文章.

    集成Lua到你的Android游戏

    http://www.cnblogs.com/astin/archive/2011/07/26/2117590.html

    原作者,可能有些地方,觉得没多大关系就没有注明,我这里帮一些出问题的朋友说下解决方法

    1,源代码的导入,如果,你觉得一个列表那么多的代码一个个认麻烦的话,我建议,你把所有lua源代码下所有*.c,*.h的文件都导入进去

    ,这里有一点要注意的是lua4java的源代码,一开始是不提供头文件的,就是那个luajava.h要自己,编译,这个文件要在安装成功lua4java才会出现,所以,这里你要自己编译,会jni的同学,应该知道怎么编译了吧…文件在,src\java\org\keplerproject\luajava\LuaState.java

    2,llex.c文件在编译的时候会出现两个错误,原作者已经给出解决方案了,看着修改吧.

    image

    3,解决了这两个方法应该不会再有没什么问题了.

    原作者编译好的so,文件下载:

    http://www.kuaipan.cn/file/id_19195845228364122.html

    如果,你想自己编译,这是整理好的文件.

    http://www.kuaipan.cn/file/id_2622545685695567.html

    原文:http://www.cnblogs.com/youxilua/archive/2011/10/19/2217871.html

  • 相关阅读:
    weka 学习
    支持向量机SVM
    U-Air:When Urban Air Quality Inference Meets Big Data--YuZheng
    城市计算与大数据
    python报错 IndentationError: unindent does not match any outer indentation level
    js 谈this
    js mouseover mouseout 多次触发
    sql语句分页多种方式ROW_NUMBER()OVER
    在GridView中设置每个单元格的数据
    OnRowDeleting事件和OnRowCommand事件之间的触发关系
  • 原文地址:https://www.cnblogs.com/shanzei/p/2498985.html
Copyright © 2011-2022 走看看