使用Android NDK建立Mariadb客户端

Building mariadb client with Android NDK

本文关键字:Mariadb 客户端 建立 NDK Android 使用      更新时间:2023-10-16

在这里又有另一个linux构建了新的newb,努力使用ndk构建为Android构建MariaDB-CLIENT。

我已经成功地构建了OpenSSL和Libiconv,这是Prisuesites。

这是我在做的:

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在这一点代码中未定义:

#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 Thingie和libs。

所以,有什么想法是什么问题以及如何解决?

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

当前MariaDB连接器/C不支持Android NDK,这是针对即将到来的3.0.3版本进行的。

要使用Android NDK构建MariadB连接器/C,您需要查看Mariadb Connector的3.0-Portable分支/C。

ICONV支持当前不起作用,对于Kerberos/GSSAPI身份验证插件也是有效的。

用于使用Android NDK构建MariadB连接器/C,您还指定以下CMAKE参数:

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

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

将其禁用
-DWITH_SSL=OFF