使用 Android NDK 編譯 Lua
啟動 Android+Studio/">Android Studio ,建立一個 Android 專案,勾選 C++ Support。

一路 Next 到這裡,直接 Finish,不用勾選保持預設即可。

如果之前沒有安裝 NDK 和 Cmake 工具,到這裡會提示安裝 NDK 等工具,直接安裝,我這裡之前已經安裝了,所以略過。
等待工程就緒之後,正常構建一次,看 Hello World 能不能正常構建執行起來。檢視編譯後的 APK 檔案,看看裡面是否有下列目錄和 .so 檔案。
Executing tasks: [:app:assembleDebug] 省略一堆Log External native generate JSON debug: JSON generation completed without problems :app:externalNativeBuildDebug Build native-lib x86_64 [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o [2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libnative-lib.so Build native-lib x86 [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o [2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libnative-lib.so Build native-lib arm64-v8a [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o [2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so Build native-lib armeabi-v7a [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o [2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so :app:compileDebugSources :app:mergeDebugShaders :app:compileDebugShaders :app:generateDebugAssets :app:mergeDebugAssets :app:transformClassesWithDexBuilderForDebug :app:transformDexArchiveWithExternalLibsDexMergerForDebug :app:transformDexArchiveWithDexMergerForDebug :app:mergeDebugJniLibFolders :app:transformNativeLibsWithMergeJniLibsForDebug :app:transformNativeLibsWithStripDebugSymbolForDebug :app:processDebugJavaRes NO-SOURCE :app:transformResourcesWithMergeJavaResForDebug :app:validateSigningDebug :app:packageDebug :app:assembleDebug BUILD SUCCESSFUL in 12s 29 actionable tasks: 16 executed, 13 up-to-date
通過 7-Zip 可以檢視 APK 裡面的檔案組成結構,如下是 lib 目錄下的內容,分別對應不同的 CPU 架構。

如果能到這一步,說明至少 Android Studio 配置基本是 OK 的,NDK 能正常工作。
在 Android Studio 3.1 後,Gradle Console 就不見了,要檢視構建過程和步驟,在 Build 視窗點選 Toggle View 就可以檢視構建步驟了。

在 Project 面板中,CPP 目錄下的檔案就是 C/CPP 的原始檔目錄,我們從 Lua 官網下載原始碼後,將 .c 和 .h 檔案當道這個目錄下面。

目前我能下載到最新的 Lua 版本是 5.3.5 ,貼上到 CPP 目錄後,檔案並不會顯示,不知道這是不是 Android Studio 的 bug,接下來修改 CMakeLists.txt 裡面的內容,將原始碼增加到構建列表。
add_library( # Sets the name of the library. luajit # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/lapi.c src/main/cpp/lauxlib.c src/main/cpp/lbaselib.c src/main/cpp/lbitlib.c src/main/cpp/lcode.c src/main/cpp/lcorolib.c src/main/cpp/lctype.c src/main/cpp/ldblib.c src/main/cpp/ldebug.c src/main/cpp/ldo.c src/main/cpp/ldump.c src/main/cpp/lfunc.c src/main/cpp/lgc.c src/main/cpp/linit.c src/main/cpp/liolib.c src/main/cpp/llex.c src/main/cpp/lmathlib.c src/main/cpp/lmem.c src/main/cpp/loadlib.c src/main/cpp/lobject.c src/main/cpp/lopcodes.c src/main/cpp/loslib.c src/main/cpp/lparser.c src/main/cpp/lstate.c src/main/cpp/lstate.h src/main/cpp/lstring.c src/main/cpp/lstrlib.c src/main/cpp/ltable.c src/main/cpp/ltablib.c src/main/cpp/ltm.c src/main/cpp/lua.c src/main/cpp/lua.hpp src/main/cpp/lundump.c src/main/cpp/lutf8lib.c src/main/cpp/lvm.c src/main/cpp/lzio.c)
執行編譯,這個時候 Build 視窗可能會出現一片紅 ...

具體錯誤內容如下:
Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. Error while executing process D:\ANDROID\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build D:\ANDROID_PROJECTS\HelloLua2\app\.externalNativeBuild\cmake\debug\x86_64 --target luajit} [1/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [2/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [3/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [4/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [5/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [6/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [7/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [8/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [9/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [10/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [11/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [12/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [13/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [14/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [15/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [16/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [17/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [18/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [19/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [20/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [21/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [22/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [23/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [24/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [25/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [26/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [27/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [28/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/luac.c.o [29/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [30/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [31/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [32/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [33/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [34/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [35/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp\loslib.c:169:3: warning: 'tmpnam' is deprecated: tempnam is unsafe, use mkstemp or tmpfile instead [-Wdeprecated-declarations] lua_tmpnam(buff, err); ^ D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp\loslib.c:131:33: note: expanded from macro 'lua_tmpnam' #define lua_tmpnam(b,e){ e = (tmpnam(b) == NULL); } ^ D:/ANDROID/Sdk/ndk-bundle/sysroot/usr/include\stdio.h:167:5: note: 'tmpnam' has been explicitly marked deprecated here __warnattr("tempnam is unsafe, use mkstemp or tmpfile instead"); ^ D:/ANDROID/Sdk/ndk-bundle/sysroot/usr/include\sys/cdefs.h:160:40: note: expanded from macro '__warnattr' #define __warnattr(msg) __attribute__((deprecated(msg))) ^ 1 warning generated. [36/36] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libluajit.so FAILED: cmd.exe /C "cd . && D:\ANDROID\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe--target=x86_64-none-linux-android21 --gcc-toolchain=D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=D:/ANDROID/Sdk/ndk-bundle/sysroot -fPIC -isystem D:/ANDROID/Sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security-O0 -fno-limit-debug-info-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot D:/ANDROID/Sdk/ndk-bundle/platforms/android-21/arch-x86_64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -LD:/ANDROID/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86_64 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libluajit.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libluajit.so CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o CMakeFiles/luajit.dir/src/main/cpp/linit.c.o CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o CMakeFiles/luajit.dir/src/main/cpp/llex.c.o CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o CMakeFiles/luajit.dir/src/main/cpp/lua.c.o CMakeFiles/luajit.dir/src/main/cpp/luac.c.o CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o-llog -latomic -lm && cd ." D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: CMakeFiles/luajit.dir/src/main/cpp/luac.c.o: multiple definition of 'main' D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: CMakeFiles/luajit.dir/src/main/cpp/lua.c.o: previous definition here clang.exe: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 9s 21 actionable tasks: 18 executed, 3 up-to-date
提示中說的也比較清楚,我們使用了已經廢棄了的函式:warning: 'tmpnam' is deprecated: tempnam is unsafe, use mkstemp or tmpfile instead,但是專案中,使用這個 tmpnam 的比較多,而且需要改 Lua 原始碼,本著不對 Lua 改動的原則,我們在 CMakeLists.txt 中增加下面的一行程式碼,遮蔽廢棄函式的錯誤警告。
add_definitions(-Wno-deprecated)
最終,檔案結構如下:

繼續編譯,發現依然編譯不通過,Build 視窗依然一片紅,如下:
Executing tasks: [clean, :app:assembleDebug] 省略一堆Log * What went wrong: Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. Error while executing process D:\ANDROID\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build D:\ANDROID_PROJECTS\HelloLua2\app\.externalNativeBuild\cmake\debug\x86_64 --target luajit} Recompacting log... [1/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [2/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [3/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [4/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [5/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [6/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [7/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [8/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [9/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [10/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [11/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [12/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [13/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [14/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [15/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [16/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [17/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [18/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [19/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [20/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [21/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [22/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [23/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [24/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [25/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [26/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [27/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [28/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [29/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [30/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [31/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [32/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [33/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [34/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/luac.c.o [35/36] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [36/36] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libluajit.so FAILED: cmd.exe /C "cd . && D:\ANDROID\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe--target=x86_64-none-linux-android21 --gcc-toolchain=D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=D:/ANDROID/Sdk/ndk-bundle/sysroot -fPIC -isystem D:/ANDROID/Sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security-O0 -fno-limit-debug-info-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot D:/ANDROID/Sdk/ndk-bundle/platforms/android-21/arch-x86_64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -LD:/ANDROID/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86_64 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libluajit.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libluajit.so CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o CMakeFiles/luajit.dir/src/main/cpp/linit.c.o CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o CMakeFiles/luajit.dir/src/main/cpp/llex.c.o CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o CMakeFiles/luajit.dir/src/main/cpp/lua.c.o CMakeFiles/luajit.dir/src/main/cpp/luac.c.o CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o-llog -latomic -lm && cd ." D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: CMakeFiles/luajit.dir/src/main/cpp/luac.c.o: multiple definition of 'main' D:/ANDROID/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: CMakeFiles/luajit.dir/src/main/cpp/lua.c.o: previous definition here clang.exe: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 9s 21 actionable tasks: 19 executed, 2 up-to-date
在這個錯誤裡,有兩處非常明顯:
error: CMakeFiles/luajit.dir/src/main/cpp/luac.c.o: multiple definition of 'main' CMakeFiles/luajit.dir/src/main/cpp/lua.c.o: previous definition here
事實上,我們也不需要 Main 函式的定義,因為編譯為 SHARE_LIBRARY ,所以遮蔽這個檔案即可。

再次構建,發現還是一片紅... 錯誤如下:
省略一堆Log Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. Error while executing process D:\ANDROID\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build D:\ANDROID_PROJECTS\HelloLua2\app\.externalNativeBuild\cmake\debug\x86 --target luajit} [1/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [2/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [3/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [4/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [5/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [6/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [7/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [8/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [9/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [10/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [11/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [12/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [13/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [14/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [15/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [16/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [17/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [18/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [19/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [20/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [21/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [22/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [23/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [24/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [25/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [26/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [27/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [28/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [29/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [30/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [31/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [32/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [33/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [34/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [35/35] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libluajit.so FAILED: cmd.exe /C "cd . && D:\ANDROID\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe--target=i686-none-linux-android19 --gcc-toolchain=D:/ANDROID/Sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64 --sysroot=D:/ANDROID/Sdk/ndk-bundle/sysroot -fPIC -isystem D:/ANDROID/Sdk/ndk-bundle/sysroot/usr/include/i686-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security-O0 -fno-limit-debug-info-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot D:/ANDROID/Sdk/ndk-bundle/platforms/android-19/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -LD:/ANDROID/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libluajit.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libluajit.so CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o CMakeFiles/luajit.dir/src/main/cpp/linit.c.o CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o CMakeFiles/luajit.dir/src/main/cpp/llex.c.o CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o CMakeFiles/luajit.dir/src/main/cpp/lua.c.o CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o-llog -latomic -lm && cd ." D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp/liolib.c:446: error: undefined reference to 'localeconv' D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp/lobject.c:287: error: undefined reference to 'localeconv' D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp/lobject.c:381: error: undefined reference to 'localeconv' D:\ANDROID_PROJECTS\HelloLua2\app\src\main\cpp/lstrlib.c:936: error: undefined reference to 'localeconv' clang.exe: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 12s 21 actionable tasks: 18 executed, 3 up-to-date
這次的錯誤都是這一個:undefined reference to 'localeconv',解決辦法是提高 API Level ,我們把它改為 21 以上就可以解決這個問題。
再次構建,終於不再報錯了,結果如下:
Executing tasks: [clean, :app:assembleDebug] 省略一堆Log :app:externalNativeBuildCleanDebug Clean luajit armeabi-v7a Cleaning... 0 files. Clean luajit arm64-v8a Cleaning... 0 files. Clean luajit x86 Cleaning... 0 files. Clean luajit x86_64 Cleaning... 35 files. :app:externalNativeBuildCleanRelease Clean luajit armeabi-v7a Cleaning... 0 files. Clean luajit arm64-v8a Cleaning... 0 files. Clean luajit x86 Cleaning... 0 files. Clean luajit x86_64 Cleaning... 0 files. :app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild :app:compileDebugAidl :app:compileDebugRenderscript :app:checkDebugManifest :app:generateDebugBuildConfig :app:prepareLintJar UP-TO-DATE :app:mainApkListPersistenceDebug :app:generateDebugResValues :app:generateDebugResources :app:mergeDebugResources :app:createDebugCompatibleScreenManifests :app:processDebugManifest :app:splitsDiscoveryTaskDebug :app:processDebugResources :app:generateDebugSources :app:javaPreCompileDebug :app:compileDebugJavaWithJavac :app:generateJsonModelDebug UP-TO-DATE :app:externalNativeBuildDebug Build luajit x86_64 Recompacting log... [1/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [2/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [3/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [4/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [5/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [6/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [7/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [8/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [9/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [10/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [11/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [12/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [13/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [14/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [15/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [16/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [17/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [18/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [19/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [20/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [21/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [22/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [23/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [24/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [25/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [26/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [27/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [28/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [29/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [30/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [31/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [32/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [33/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [34/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [35/35] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libluajit.so Build luajit x86 [1/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [2/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [3/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [4/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [5/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [6/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [7/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [8/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [9/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [10/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [11/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [12/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [13/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [14/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [15/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [16/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [17/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [18/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [19/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [20/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [21/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [22/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [23/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [24/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [25/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [26/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [27/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [28/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [29/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [30/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [31/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [32/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [33/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [34/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [35/35] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libluajit.so Build luajit arm64-v8a [1/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [2/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [3/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [4/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [5/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [6/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [7/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [8/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [9/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [10/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [11/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [12/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [13/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [14/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [15/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [16/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [17/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [18/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [19/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [20/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [21/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [22/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [23/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [24/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [25/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [26/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [27/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [28/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [29/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [30/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [31/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [32/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [33/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [34/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [35/35] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libluajit.so Build luajit armeabi-v7a [1/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcorolib.c.o [2/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbitlib.c.o [3/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lapi.c.o [4/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lauxlib.c.o [5/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lbaselib.c.o [6/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lcode.c.o [7/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldo.c.o [8/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/llex.c.o [9/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldump.c.o [10/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lobject.c.o [11/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/liolib.c.o [12/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmathlib.c.o [13/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lmem.c.o [14/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loadlib.c.o [15/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldebug.c.o [16/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lfunc.c.o [17/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ldblib.c.o [18/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lgc.c.o [19/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/linit.c.o [20/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lctype.c.o [21/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lua.c.o [22/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lopcodes.c.o [23/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltm.c.o [24/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/loslib.c.o [25/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lundump.c.o [26/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltable.c.o [27/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstring.c.o [28/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lutf8lib.c.o [29/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lzio.c.o [30/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstate.c.o [31/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lvm.c.o [32/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/ltablib.c.o [33/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lstrlib.c.o [34/35] Building C object CMakeFiles/luajit.dir/src/main/cpp/lparser.c.o [35/35] Linking C shared library ..\..\..\..\build\intermediates\cmake\debug\obj\armeabi-v7a\libluajit.so :app:compileDebugSources :app:mergeDebugShaders :app:compileDebugShaders :app:generateDebugAssets :app:mergeDebugAssets :app:transformClassesWithDexBuilderForDebug :app:transformDexArchiveWithExternalLibsDexMergerForDebug :app:transformDexArchiveWithDexMergerForDebug :app:mergeDebugJniLibFolders :app:transformNativeLibsWithMergeJniLibsForDebug :app:transformNativeLibsWithStripDebugSymbolForDebug :app:processDebugJavaRes NO-SOURCE :app:transformResourcesWithMergeJavaResForDebug :app:validateSigningDebug :app:packageDebug :app:assembleDebug BUILD SUCCESSFUL in 20s 33 actionable tasks: 30 executed, 3 up-to-date
再生成 APK,使用 7-ZIP 檢視 APK,就可以看到我們 Lua 已經穩妥妥的在 APK 安裝包中了,達到 340 KB了,對於 so 庫來說也不小了。

至此,Lua 已經編譯好了,如果需要使用,還需要寫 JNI 方法呼叫,不過那是後話了。
Github 地址: ofollow,noindex">https://github.com/yahch/Luandroid