使用 Android NDK 编译 Lua

启动 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 ........buildintermediatescmakedebugobjx86_64libnative-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 ........buildintermediatescmakedebugobjx86libnative-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 ........buildintermediatescmakedebugobjarm64-v8alibnative-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 ........buildintermediatescmakedebugobjarmeabi-v7alibnative-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:ANDROIDSdkcmake3.6.4111459bincmake.exe with arguments {--build D:ANDROID_PROJECTSHelloLua2app.externalNativeBuildcmakedebugx86_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_PROJECTSHelloLua2appsrcmaincpploslib.c:169:3: warning: 'tmpnam' is deprecated: tempnam is unsafe, use mkstemp or tmpfile instead [-Wdeprecated-declarations]
    lua_tmpnam(buff, err);
    ^
  D:ANDROID_PROJECTSHelloLua2appsrcmaincpploslib.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/includestdio.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/includesys/cdefs.h:160:40: note: expanded from macro '__warnattr'
  #define __warnattr(msg) __attribute__((deprecated(msg)))
                                         ^
  1 warning generated.
  [36/36] Linking C shared library ........buildintermediatescmakedebugobjx86_64libluajit.so
  FAILED: cmd.exe /C "cd . && D:ANDROIDSdkndk-bundletoolchainsllvmprebuiltwindows-x86_64binclang.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 ........buildintermediatescmakedebugobjx86_64libluajit.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/binld: 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/binld: 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:ANDROIDSdkcmake3.6.4111459bincmake.exe with arguments {--build D:ANDROID_PROJECTSHelloLua2app.externalNativeBuildcmakedebugx86_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 ........buildintermediatescmakedebugobjx86_64libluajit.so
  FAILED: cmd.exe /C "cd . && D:ANDROIDSdkndk-bundletoolchainsllvmprebuiltwindows-x86_64binclang.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 ........buildintermediatescmakedebugobjx86_64libluajit.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/binld: 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/binld: 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:ANDROIDSdkcmake3.6.4111459bincmake.exe with arguments {--build D:ANDROID_PROJECTSHelloLua2app.externalNativeBuildcmakedebugx86 --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 ........buildintermediatescmakedebugobjx86libluajit.so
  FAILED: cmd.exe /C "cd . && D:ANDROIDSdkndk-bundletoolchainsllvmprebuiltwindows-x86_64binclang.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 ........buildintermediatescmakedebugobjx86libluajit.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_PROJECTSHelloLua2appsrcmaincpp/liolib.c:446: error: undefined reference to 'localeconv'
  D:ANDROID_PROJECTSHelloLua2appsrcmaincpp/lobject.c:287: error: undefined reference to 'localeconv'
  D:ANDROID_PROJECTSHelloLua2appsrcmaincpp/lobject.c:381: error: undefined reference to 'localeconv'
  D:ANDROID_PROJECTSHelloLua2appsrcmaincpp/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 ........buildintermediatescmakedebugobjx86_64libluajit.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 ........buildintermediatescmakedebugobjx86libluajit.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 ........buildintermediatescmakedebugobjarm64-v8alibluajit.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 ........buildintermediatescmakedebugobjarmeabi-v7alibluajit.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 地址:https://github.com/yahch/Luandroid

Android使用Jenkins自动化构建测试打包apk

Jenkins这东西搭建起来真是一点也不省心啊,看着别人的教程摸着石头过河,配置的东西有点多啊,稍有不慎,就构建不成功啦!即使步骤跟别人一样也会报各种乱七八糟的错误啊哈哈~~这东西只能佛系搭建~~在经历几十次的随缘构建之后,终于构建成功啦~~好感人!眼泪掉下来。。。。。。在此做下记录,造福广大群众!阿弥陀佛~~废话少说,且看如下操作:

下载Jenkins并安装

官网下载地址:https://jenkins.io/download

未分类

我们下载如图所示Window版本,下载下来是个.zip的压缩包,我们解压一下得到如下图所示文件:

未分类

双击即可开始安装,一直Next,即可安装完成。

环境变量配置

  • Java环境配置
  • Android SDK环境配置

右键此电脑-属性-高级系统设置-环境变量

在系统变量中添加 :

变量名 JAVA_HOME

变量值 E:Javajdk8 (路径根据自己实际的java安装目录选择)

变量名 ANDROID_HOME

变量值 E:AndroidSDK (路径根据自己实际的java安装目录选择)

未分类

然后在系统的Path变量中添加 :%Java_Home%bin

未分类

以上是Java环境的基本配置,作为一名Android开发攻城狮应该都知道基本操作。接下来就是重头戏啦!!!

Jenkins配置

安装完jenkins一般会自动在浏览器中打开,没有的话在浏览器输入 localhost:8080 或者 127.0.0.1:8080 页面出来后会提示选择安装插件,第一个是默认推荐的插件,第二个是自己选择要安装的插件

未分类

我们直接选默认的就好,点击第一个坐等jenkins自动安装插件

未分类

插件安装后需要创建你的账号

未分类

创建完就可以登录Jenkins控制台啦!

未分类

点击左侧 系统管理-系统设置

未分类

来到如下设置页面:

未分类

点开主目录右边的高级设置,修改一下工作空间根目录(路径任意,自己知道就行),若不改,aapt编译时会报错,因为windows版本默认的根目录在C盘底下路径过长

未分类

往下拉配置全局属性,勾选环境变量,添加如下键值对

未分类

为什么说GRADLE_USER_HOME字段要固定写呢,因为要和Gradle的配置字段一致,否则编译会报错,如果这里不进行配置Gradle会使用默认的目录,会因为默认目录路径太长导致编译报错,是不是很坑!!!

未分类

配置完点击左下角保存按钮保存配置。

回到主页面点击左侧 新建任务

未分类

输入一个任务名称,选择构建一个自由风格的软件项目,点击确定

未分类

这样在 我的视图 里就能看到创建的任务啦,点击任务,进入任务详细页面

未分类

点击配置,进行构建前的详细配置,先配置普通项General,勾选Github prooject,设置远程仓库地址,以Github为例:

未分类

然后设置 源码管理 勾选Git,添加Github项目地址,你的Github账号密码

未分类

然后设置 构建触发器 (非必需设置)设置了只是多了一种构建方式,可以勾选 触发远程构建 ,然后设置一个身份验证令牌,即可通过浏览器访问链接触发构建

未分类

如红色方框所示,有两种拼接链接的方式触发构建,你可以在浏览器中输入 localhost:8080/me/my-views/view/all/job/Test/build?token=123456 或者 /buildWithParameters?token=123456 来触发构建。

也可以勾选Poll SCM,设置每隔一段时间自动构建,我设置了每小时构建一次,如下图所示

未分类

语法参考如下:

未分类

接下来设置 构建 点击增加构建步骤,选择Invoke Gradle script

未分类

勾选Invoke Gradle,选择gradle

未分类

Tasks 填写 clean build 命令

未分类

最后设置 构建后操作 点击增加构建后操作步骤,选择Archive the artifacts

未分类

填入正则表达式路径,匹配用于存档的apk

未分类

app/build/outputs/release/*.apk的意思是匹配app/build/outputs/release路径下所有拓展名为.apk的安装包,看这路径是不是很熟悉,其实就是项目路径下apk的输出路径

未分类

存档后Jenkins-release-v1.0.0.apk就会显示在Jenkins项目最后一次成功的构建结果

未分类

到此配置基本完成,是时候构建一波了,回到任务主页,点击立即构建

未分类

左下角会出现构建进度,蓝色圆点表示成功,红色圆点表示失败,点击构建序号,下拉选择控制台输出可以查看构建日志

未分类

未分类

至此,构建就大功告成啦!

在本地的JenkinsWork工作空间目录下可以看到从Github上拉取的项目源码

未分类

构建成功打包的apk在此目录下

未分类

接下来我们可以设置让构建打包好的apk自动发布到fir,详细教程请移步至http://blog.fir.im/jenkins文章写得很详细,我就不多说了。发布到fir后,平常测试人员找你要测试包,你可以对他说:“自己去fir下载。”一脸帅气.jpg

好了,今天就分享到这,祝大家Jenkins构建之路愉快!