android 编译luajit,Android 嵌入 LuaJIT 的曲折道路

相关链接:Windows 下编译 LuaJIT

懒人与伸手党可以直接看最底部。

为什么使用 LuaJIT

Lua 官方版的编译嵌入相对简单,但是为什么要用 LuaJIT 呢?我所了解到的优势有:

更高的运行效率。

支持运行 Lua 编译后的机器码。

虽然 Lua 也支持编译脚本,但是编译出来的机器码文件并不是跨平台的,也就是说在

PC 上编译的脚本在 Android 中无法使用。至于如何编译 Android 上使用的脚本,至今没有找到方案。

脚本的编译不仅可以提高载入速度,更可以一定程度上保护源码,避免被篡改。这也是我使用 LuaJIT 的主要原因。

LuaJIT NDK 编译

系统环境:Ubuntu 17 x64

Windows 下使用 Cygwin 应该也是可以的。

由于我们系统是64位,编译的目标很可能是32位的,所以先确认安装了32位所需的编译环境:

sudo apt-get install libc6-dev-i386

NDK 配置

已经配置好 NDK 的可以略过本章节。

去 NDK 官网下载适合自己的版本并解压。这里使用的是 android-ndk-r14b-linux-x86_64.

解压放在 /opt/android/ndk.

然后配置环境变量。这里直接配置全局的环境变量。修改 /etc/proile 在最后加上

export PATH=/opt/android/ndk:$PATH

注销重新登录一下使之生效。测试下命令 ndk-build,能运行则是配置完毕。

编译

首先去 LuaJIT 官网下载源码并解压。

按照官方指南,新建一个 build.sh 放在解压目录下,根据实际需求输入指令:

注意根据实际环境配置,有几个地方需要修改一下。

然后执行 sh build.sh 就应该可以编译了。

但是实际情况总是没有那么顺利。

ec181ab570b5eafccf85dca5a1ef9276.png

折腾了3天,最后发现原来是变量引用问题。我不是很熟悉 shell,所以也就不再深究了,直接把 make 的所有参数写在一行里,就这么神奇地成功了。

如果之前编译(失败)过,记得先 make clean 清理下文件。编译成功后可看到如下提示:

df50df86dbd98691469321114558a86b.png

之后可以在 src 目录里找到编译出的 .a 静态库文件。通过改变编译脚本,可以编译出 armeabi-v7a x86 等不同 ABI 下的文件。

整合 Android

得到了静态库,下面就要整合进 Android 工程。由于 Lua 只提供的 C API,所以在 Android 中需要通过 JNI 来实现调用。还好有个 luajava 的开源库帮我们实现了这个繁琐的过程。而 androlua 又把 luajava 整合进了 Android. 我们这里是借用这个库来整合 LuaJIT.

导入 luajava 源码

创建 jni/luajava/ 目录,将 luajava.c 复制到创建的目录。

在 jni/ 下创建 Android.mk,输入 include $(call all-subdir-makefiles).

导入 LuaJIT 静态库

在 jni/luajava/ 下根据 ABI 创建子目录,例如 armeabi-v7a x86,将之前编译出的 .a 文件放进对应的目录中。

在 jni/luajava/ 下创建 Android.mk,输入:

将需要的头文件复制到 jni/luajava/ 目录。

包括:lauxlib.h lua.h lua.hpp luaconf.h luajava.h luajit.h lualib.h

这些文件可以在 LuaJIT 的源码目录找到。

最后在模块的 build.gradle 文件的 android->defaultConfig 节点内添加下面代码:

编译完成后就可以愉快地使用 LuaJIT 了。

源码与懒人必备

源码已经在 github 了。

并且传到了 JCenter,无需自己编译,直接添加依赖就可以使用:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)

前言 记得刚来这家公司的时候,我部门就我一个运维工程师,然后就是经理,刚开始公司平台什么监控都没有,在我与经理的努力下,先搭建nagioscacti监控平台,后来随着公司业务的增加,平台的功能与服务…

面试风云录(01) - 怎样回答这两个问题?

由于工作经历的缘故,使我有一些面试别人的机会,所以应该还有一些经验可以跟大家聊聊。 当我们提到“面试” 这个词,总是让人有种阶级感,好像面试官就是高高在上,而面试者则是屈居于下,其实并非如此&#xf…

Redis Python

Python操作Redis 安装Python使用Redis的库 sudo pip install redis or sudo easy_install redis or 源码安装 详见:https://github.com/WoLpH/redis-py 1.1 操作模式 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大…

android 代码写命令,monkey基本命令及脚本编写(示例代码)

Monkey 是Android自带的黑盒测试工具,一般通过随机触发界面事件,来确定应用是否会发生异常,多用于android应用的稳定性、压力测试基本命令:adb shell monkey [options] usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] .…

js更新数组对象_7 种Vue 数据已更新而页面没有更新的情况及深化总结(收藏)

作者:前端1943链接:https://segmentfault.com/a/1190000022772025如果你发现你自己需要在 Vue 中做一次强制更新,99.9% 的情况,是你在某个地方做错了事。1. Vue 无法检测实例被创建时不存在于 data 中的 property原因:…

从P560小型机B181201B故障代码识别手把手详解

背景:生产小型机发生宕机事件,现场发现液晶面板存在B181201B代码,可是查看网络,未见有权威的参考文章,通过管理口登录HMC管理界面,发现错误代码B181201B,同时提示可能是电源故障,后登…

Java反射中method.isBridge() 桥接方法

桥接方法是 JDK 1.5 引入泛型后&#xff0c;为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容&#xff0c;由编译器自动生成的方法。我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法。 假定接口 public interface SuperClass<T> {void met…

python 利用pexpect进行多机远程命令执行

在安装之前&#xff0c;确认你的机器安装了python,和easy_install.通常python是自动安装的&#xff0c;如果没有安装easy_install&#xff0c;那么wget -q http://peak.telecommunity.com/dist/ez_setup.py 获取一下python ez_setup.pypexpect是python一个模块&#xff0c;可以…

Python 之 线程

进程 之前我们已经了解了操作系统中进程的概念&#xff0c;程序并不能单独运行&#xff0c;只有将程序装载到内存中&#xff0c;系统为它分配资源才能运行&#xff0c;而这种执行的程序就称之为进程。程序和进程的区别就在于&#xff1a;程序是指令的集合&#xff0c;它是进程…

flymcu无法打开串口_西门子1200与其他PLC/组态软件无线串口通讯(自由口)

一、控制系统原理图1:控制系统原理二、硬件需求S7-1200 PLC目前有3种类型的CPU&#xff1a;1)S7-1211C CPU2)S7-1212C CPU3)S7-1214C CPU这三种类型的CPU都可以连接三个串口通信模版本例中使用的PLC硬件为&#xff1a;1)PM1207电源(6EP1 332-1SH71)2)S7-1214C(6ES7 214-1BE30-0…

android按钮固定尺寸,如何在android中保持按钮的固定宽高比

我正在改进你的XML.我没有测试它,但它应该工作.建议的更改是,而不是将图像设置为背景,将其设置为ImageButtons的src.此外,如果您坚持使用Button,则可以使用其他布局包装每个按钮,并将其重力属性设置为“center”.看一下下面的XML.android:layout_width"fill_parent"a…

横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

横空出世&#xff0c;席卷互联网 ---评微软数据结构算法面试100题 作者&#xff1a;July。 时间&#xff1a;2010年10月-11月。版权所有&#xff0c;侵权必究。 出处&#xff1a;http://blog.csdn.net/v_JULY_v。 说明&#xff1a;本文原题为&#xff1a;“横空出世&#xff0c…

收银管理系统怎样帮助商家很好地经营服装门店

收银管理系统对于服装门店的经营可以提供多方面的帮助&#xff0c;以下是一些具体的优势和功能&#xff1a; 1. 快速准确的收银&#xff1a;收银管理系统可以实现快速、准确的收银操作&#xff0c;通过条码扫描或手动输入商品信息&#xff0c;自动计算价格并生成收据。这样可以…

BZOJ 1567: [JSOI2008]Blue Mary的战役地图

二次联通门 : BZOJ 1567: [JSOI2008]Blue Mary的战役地图 /*BZOJ 1567: [JSOI2008]Blue Mary的战役地图社会我栋哥人怂P话多暴力能A题正解能WA0*/ #include <cstdio> #include <iostream>#define rg register inline void read (int &n) {rg char c getchar (…

python模拟输入回车键_用Python模拟键盘输入

import win32apiimport win32conwin32api.keybd_event(17,0,0,0) #ctrl键位码是17win32api.keybd_event(86,0,0,0) #v键位码是86win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)附个键位码表&#xff…

Python 之 进程

目录 理论知识 操作系统背景知识 进程 什么是进程 进程调度 进程的并行与并发 同步异步阻塞非阻塞 同步和异步 阻塞与非阻塞 同步/异步与阻塞/非阻塞 组合 进程的创建与结束 进程的创建 进程的结束 在python程序中的进程操作 multiprocess&#xff08;multiproc…

从全息投影到全息平台,必须克服7个障碍

“每个科幻爱好者和痴迷技术的人儿都希望能拥有一个全息成像台。不幸的是&#xff0c;制造全息平台的技术还尚未被人类掌握。据说我们离这项技术可用之时还有大约10到15年的时间——这是 AMD 的专业人士 Phil Rogers 说的&#xff0c;他专攻 3D 技术工作已超过20年。在《今日宇…

android fragment fragmenttransaction,Android FragmentTransaction 常用方法总结

FragmentManage&#xff1a;FragmentManager能够实现管理activity中fragment. 通过调用activity的getFragmentManager()取得它的实例.FragmentManager可以做如下一些事情:1、使用findFragmentById() (用于在activity ...public class Toolkit { /** * * Role:Telec…

IBM总架构师寇卫东:话说程序员的职业生涯-IT程序人生-职业生涯规划

初级程序员和高级程序员时期&#xff0c;都属于职业生涯发展的第一阶段&#xff0c;我们可以称之为黄金时期。这阶段程序员的年龄在20~35岁之间&#xff0c;因为年轻&#xff0c;所以更善于学习&#xff0c;而且体力充沛&#xff0c;很多走过这个阶段的程序员有过通宵工作的经历…

metric learning -- 马氏距离与欧氏距离

一 基本概念 方差&#xff1a;&#xff08;variance&#xff09;是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望&#xff08;即均值&#xff09;之间的偏离程度。统计中的方差&#xff08;样本方差&#xff09;是每个…