用android ndk项目构建其他库

Building other library with android ndk project

本文关键字:其他 构建 项目 android ndk      更新时间:2023-10-16

我很难将dlib与我的android studio NDK项目集成,基本上我想在我的本地c++代码中使用库,我不确定做同样的标准方式,我有我的Android.mk文件下app/src/main/jni为:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := dlib
LOCAL_SRC_FILES :=  dlib/all/source.cpp
LOCAL_CPPFLAGS  = -I/opt/X11/include
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
OPENCVROOT:= /Users/anmoluppal/Downloads/OpenCV-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_MODULE    := ndkDemo
LOCAL_STATIC_LIBRARIES := dlib
LOCAL_SRC_FILES := main.cpp face_detector.cpp face_tracker.cpp ft_data.cpp patch_model.cpp shape_model.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk文件看起来像:

APP_STL := gnustl_static
APP_CPPFLAGS += -fexceptions -frtti
APP_ABI := all

项目结构为:

+ app
---+ src
-----+ main
-------+ jni
---------+ dlib
---------+ Application.mk
---------+ Android.mk
---------+ (... Other .cpp files)

并且我得到了很多undefined reference to错误,这些错误是指Mac上的X11库,这确实安装正确,我想知道这是否是在NDK项目中包含库的正确方式?或者我需要在dlib文件夹中创建一个Android.mk文件?我也不知道.mk文件需要作为LOCAL_SRC_FILES的主要.cpp文件。

ndk-build之后,我得到以下输出:

[arm64-v8a] Compile++      : ndkDemo <= main.cpp
[arm64-v8a] Compile++      : ndkDemo <= face_detector.cpp
[arm64-v8a] Compile++      : ndkDemo <= face_tracker.cpp
[arm64-v8a] Compile++      : ndkDemo <= ft_data.cpp
[arm64-v8a] Compile++      : ndkDemo <= patch_model.cpp
[arm64-v8a] Compile++      : ndkDemo <= shape_model.cpp
[arm64-v8a] Compile++      : dlib <= source.cpp
[arm64-v8a] StaticLibrary  : libdlib.a
[arm64-v8a] SharedLibrary  : libndkDemo.so

您需要考虑几件事。首先:您链接的库需要针对各自的abi进行交叉编译。您的应用程序。mk表示所有,所以您需要提供所有(arm, x86, MIPS,…)。您的库是预先构建的吗?在这种情况下,您需要手动交叉编译它们。

您缺少库的包含目录。你可以用:

LOCAL_EXPORT_C_INCLUDES
LOCAL_C_INCLUDES

这是代替使用CPP-Flags的方法。

在你的makefile中还有其他一些问题,你应该通过在stackoverflow上检查其他人的makefile或在NDK文档中搜索来解决。例如,我认为你不能像以前那样提供LOCAL_SRC_FILES,你需要像这样用反斜杠分隔它们:

LOCAL_SRC_FILES :=  x.cpp  y.cpp

你的项目结构很好,我认为你差不多成功了。

当您解决了链接错误后,请随时提供您的makefiles的新版本。