使用 Android NDK 构建 mariadb 客户端

Posted

技术标签:

【中文标题】使用 Android NDK 构建 mariadb 客户端【英文标题】:Building mariadb client with Android NDK 【发布时间】:2017-09-04 18:37:11 【问题描述】:

这里又一个 linux build newb,正在努力使用 NDK 为 android 构建 mariadb-client。

我已经成功构建了openssl和libiconv,它们是必备的。

这是我正在做的:

export ANDROID_NDK_ROOT="/home/dev/android-ndk-r12b"
SR="$ANDROID_NDK_ROOT/platforms/android-16/arch-arm"
BR="$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-"


mkdir build && cd build
PKG_CONFIG_PATH=$SR/usr/lib/pkgconfig cmake -DCMAKE_AR="$BR"ar -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="$BR"gcc -DCMAKE_C_FLAGS=--sysroot=$SR -DCMAKE_INSTALL_PREFIX=$SR/usr -DCMAKE_LINKER="$BR"ld -DCMAKE_NM="$BR"nm -DCMAKE_OBJCOPY="$BR"objcopy -DCMAKE_OBJDUMP="$BR"objdump -DCMAKE_RANLIB="$BR"ranlib -DCMAKE_STRIP="$BR"strip -DWITH_EXTERNAL_ZLIB=ON -DICONV_INCLUDE_DIR=$SR/usr/include -DICONV_LIBRARIES=$SR/usr/lib/libiconv.a -DZLIB_INCLUDE_DIR=$SR/usr/include -DZLIB_LIBRARY=$SR/usr/lib/libz.so ../
make install

分解最后一部分,使其更具可读性:

PKG_CONFIG_PATH=$SR/usr/lib/pkgconfig
cmake
-DCMAKE_AR="$BR"ar
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_C_COMPILER="$BR"gcc
-DCMAKE_C_FLAGS=--sysroot=$SR
-DCMAKE_INSTALL_PREFIX=$SR/usr
-DCMAKE_LINKER="$BR"ld
-DCMAKE_NM="$BR"nm
-DCMAKE_OBJCOPY="$BR"objcopy
-DCMAKE_OBJDUMP="$BR"objdump
-DCMAKE_RANLIB="$BR"ranlib
-DCMAKE_STRIP="$BR"strip
-DWITH_EXTERNAL_ZLIB=ON
-DICONV_INCLUDE_DIR=$SR/usr/include
-DICONV_LIBRARIES=$SR/usr/lib/libiconv.a
-DZLIB_INCLUDE_DIR=$SR/usr/include
-DZLIB_LIBRARY=$SR/usr/lib/libz.so

我遇到的第一个错误是program_invocation_short_name 在this bit of code 中未定义:

#elif defined(_GNU_SOURCE)
      const char * appname = program_invocation_short_name;
#elif defined(WIN32)

我找不到这是为什么以及如何解决,所以我决定通过为其分配一个空字符串来作弊。可能会产生负面影响,但我注意到源在几行之后也在做同样的事情,所以我还是决定试一试。

又一次构建尝试,现在我得到了 iconv 函数的未定义引用:

CMakeFiles/mariadb_obj.dir/ma_charset.c.o:ma_charset.c:function mariadb_convert_string: error: undefined reference to 'iconv_open'
CMakeFiles/mariadb_obj.dir/ma_charset.c.o:ma_charset.c:function mariadb_convert_string: error: undefined reference to 'iconv'
CMakeFiles/mariadb_obj.dir/ma_charset.c.o:ma_charset.c:function mariadb_convert_string: error: undefined reference to 'iconv_close'
CMakeFiles/mariadb_obj.dir/ma_context.c.o:ma_context.c:function my_context_spawn_internal: error: undefined reference to 'setcontext'
CMakeFiles/mariadb_obj.dir/ma_context.c.o:ma_context.c:function my_context_continue: error: undefined reference to 'swapcontext'

库肯定在那里,如上面的配置中所定义。也许这是上述作弊的副作用?

或者可能是其他完全错误的东西?

再一次,在这方面是一个完整的新手,但我有一个新手预感,它可能与 cmake 有关。是否可能使用主机 cmake 但应该使用一些“android 工具链”cmake 来代替?我也找不到太多这方面的信息,但它可以解释为什么它没有选择 program_invocation_short_name 事物和库。

那么,有什么想法出了什么问题以及如何解决它?

前几行代码应该清楚构建环境,但以防万一,它是 Ubuntu 16.04 x64,使用 NDK r12b 和 GCC 4.9 工具链。我正在使用以下版本的库:libiconv 1.15、openssl 1.1.0f 和 mariadb_connector_c 3.0.3。

【问题讨论】:

【参考方案1】:

目前 MariaDB Connector/C 不支持 Android NDK,计划在即将发布的 3.0.3 版本中使用。

要使用 Android NDK 构建 MariaDB Connector/C,您需要查看 MariaDB Connector/C 的 3.0-portable 分支。

Iconv 支持目前不起作用,同样适用于 Kerberos/GSSAPI 身份验证插件。

要使用 Android NDK 构建 MariaDB 连接器/C,您还需要另外指定以下 CMake 参数:

-DWITH_ICONV=OFF -DWITH_DYNCOL=OFF -DAUTH_GSSAPI_TYPE=OFF

如果您不需要 SSL/TLS 支持,您可以通过指定禁用它

-DWITH_SSL=OFF

【讨论】:

谢谢,我会调查的。你很奇怪,我一直在按照 2 年前的逐步构建它的方法进行操作,如果有人为它制作指南,我认为它正在构建。所以也许是回归?顺便说一句,我使用的是 3.0.3 版,所以你是指同一版本的另一个版本还是什么? 最新发布的版本是3.0.2。不,来自 github (3.0.3) 的 master 分支在 3.0-portable 修复合并之前将无法工作。

以上是关于使用 Android NDK 构建 mariadb 客户端的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事

Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )(代码

Android NDK开发CMake构建工具使用

不支持 Android 11(R) 的 NDK 构建

如何在 OSX for Android studio 中设置 NDK 构建路径