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.pswp.cn/news/454584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454584.shtml
英文地址,請注明出處:http://en.pswp.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;是每個…