编译环境:
ubuntu-20.04.4 NDK-r21e libiconv-1.16.tar.gz
步骤:
一、下载安装NDK以及配置环境变量
1、下载android-ndk-r21e-linux-x86_64.zip
wget https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
2、解压android-ndk-r21e-linux-x86_64.zip
unzip android-ndk-r21e-linux-x86_64.zip
3、配置NDK的环境变量:
打开/etc/profile文件
sudo vi /etc/profile
在最后加入环境变量
export NDK_HOME=/home/awa/android-ndk-r21e
export PATH=$PATH:$NDK_HOME
让/etc/profile文件生效
source /etc/profile
检查是否安装成功
ndk-build -v
返回
二、下载libiconv-1.16.tar.gz解压并重命名为jni
1、下载libiconv-1.16.tar.gz
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
2、解压
tar zxvf libiconv-1.16.tar.gz
3、修改文件夹名为jni
mv libiconv-1.16 jni
三、创建Android.mk文件
1.进入jni创建Android.mk文件
cd jni
vi Android.mk
2、在Android.mk写入内容后保存
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libiconv
LOCAL_CFLAGS := \
-Wno-multichar \
-DANDROID \
-DLIBDIR="c" \
-DBUILDING_LIBICONV \
-DIN_LIBRARY
LOCAL_SRC_FILES := \
libcharset/lib/localcharset.c \
lib/iconv.c \
lib/relocatable.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/libcharset \
$(LOCAL_PATH)/lib \
$(LOCAL_PATH)/libcharset/include \
$(LOCAL_PATH)/srclib
#编译动态库
include $(BUILD_SHARED_LIBRARY)
#编译静态库
#include $(BUILD_STATIC_LIBRARY)
四、生成config.h文件
./configure
五、make
make
六、编译
ndk-build NDK_DEBUG=0
成功后会在根目录libs下会生成动态库
七、编译过程中出现的错误
/home/awa/obj/local/arm64-v8a/objs/iconv/libcharset/lib/localcharset.o: In function `locale_charset':
/home/awa/jni/libcharset/lib/localcharset.c:696: undefined reference to `nl_langinfo'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/awa/android-ndk-r21e/build/core/build-binary.mk:725: /home/awa/obj/local/arm64-v8a/libiconv.so] Error 1
查看localcharset.c文件发现 HAVE_LANGINFO_CODESET 这个宏被打开导致
解决方法
搜索config.h
find . -name "config.h"
将所有config.h中的
#define HAVE_LANGINFO_CODESET 1
改为
#define HAVE_LANGINFO_CODESET 0