# LuaForAndroid **Repository Path**: yongyu0102/LuaForAndroid ## Basic Information - **Project Name**: LuaForAndroid - **Description**: LuaForAndroid - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2018-03-15 - **Last Updated**: 2021-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 自己根据 官网 LUA5.1 和 luajava1.1 源码编译 编译步骤:1)去[Lua 官网](http://www.lua.org/ftp/) 选择需要版本下载源码 2)去下载 LuaJava 三方裤子源码,这个裤子最新版本是 2007 年最后更新的 [[luajava-1.1](http://files.luaforge.net/releases/luajava/luajava/LuaJava1.1/luajava-1.1.zip)] 版本,这个裤子里面只提供了 luajava.c 文件没有提供 luajava.h 文件,这个 luajava.h 文件是根据 LuaState.java 这个类生成的,你可以采用命令行 javac 将 Luajava.java 编程成 Luajava.class 文件,再用 javah 将 Luajava.class 文件编译成 luajava.h 文件,这是 java 函数与 C++ 函数对应的静态注册方法,即通过特定的规则来写,此处方法名可以随意起名字,然后还可以用动态注册的方式关联两个方法(显然,静态注册要简单一些)。 步骤细节: 1.将 luajava解压包内的 org 包整个 java 源码放在 工程目录 java 下面, 3)配置NDK 编译 so 库,编译方式自行选择(ndk build 和 CMake 方式),笔者目前使用的是 Stutio 3.0.1 ,所以采用的是 CMake 编译方式,下面简单介绍下编译流程: 1、在SDK Tools 中勾选安装 CMake、LLDB、NDK ![ndkconfig](D:\Blog\luaBlog\pic\ndkconfig.PNG) 2、File -> New -> New Project,在如下界面中勾选`Include C++ Support`,然后一路 Next,直到 Finish 为止即可(图省略)。 3、创建完成项目发现与常规项目比多了.externalNativeBuild文件夹、cpp文件夹、CMakeLists.txt文件。 **.externalNativeBuild文件夹**:cmake编译好的文件, 显示支持的各种硬件等信息。系统生成。 **cpp文件夹**:存放C/C++代码文件。 **CMakeLists.txt文件**:CMake脚本配置的文件。需要自己配置编写。 然后我们把上面第二步下载到的 **lua 和 luajava c 代码全部放在 cpp 文件夹下**,准备进行编译。(这里稍微提一句,笔者 菜鸟一枚, c 代码不懂,所以去官网下载完了,根据按照 CMake 编译规则进行编译,采坑不断。开始下载完 luajava 裤子,发现没有 luajava.h 文件,查了下,这个文件是根据 LuaState.java 编译出来的,于是笔者自己用 LuaState 编译了一个,然后 lua 源码用的是 5.3.3 版本,然后进行编译 so 库,报错。查了一下,是因为 luajava1.1 版本当时作者对应的是 lua5.1 版本,所以 api 有差异,于是重新下载了一个 lua5.1 版本编译,报错。查原因是 sdk21 之后版本采用一个原生的 c 方法,于是直接将 sdk 最小版本改成 21,编译,报错。查了一下说是 c 文件中有两个 main 函数,于是直接将一个 main 函数注释掉,一顿折腾终于编译通过,所以最后笔者从 gayhub 上找了别人升级过的 c 文件进行编译,比较稳。) **配置 CMakeLists.txt 文件**: ```txt #设置要编译 c 文件的 路径(多个 c 文件) aux_source_directory(src/main/cpp SRC_LIST) add_library( # Sets the name of the library. luajava # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). ${SRC_LIST} ) find_library( # Sets the name of the path variable. log-lib ) target_link_libraries( # Specifies the target library. luajava # Links the target library to the log library # included in the NDK. ${log-lib} ) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) ``` **配置 app/build.gradle 文件** ``` defaultConfig { externalNativeBuild { cmake { arguments "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_BUILD_TYPE=Debug" /* cppFlags "-std=c++11 -frtti -fexceptions"*/ cppFlags "-frtti -fexceptions" abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'arm64-v8a', 'mips', 'mips64', 'x86_64' } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "CMakeLists.txt" } } ``` **直接 Make Project** ,然后在 app\build\intermediates\cmake\debug\obj 文件夹下面就可以看到各种 so 文件 ![so](D:\Blog\luaBlog\pic\so.PNG) **使用** 1. `luajava` 下的 org 文件夹拷贝到工程你的工程 `src/main/java` 目录下 2. 将 `jniLibs/armeabi`下的 `libluajava.so` 重命名为 `libluajava-1.1.so` 或者修改