1.CMakeLists.txt 引入动态Opencv库 和 静态 NCNN库
cmake_minimum_required(VERSION 3.4.1)
## add ncnn prebuilt 0413
set(ncnn_path D:/scripts/ocr_android/ncnn_0413)
include_directories(${ncnn_path}/include/ncnn)
link_directories(${ncnn_path}/armeabi-v7a)
set(ncnn_lib ${ncnn_path}/armeabi-v7a/libncnn.a)
add_library (ncnn STATIC IMPORTED)
set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION ${ncnn_lib})
# add opencv
set(OpenCV_DIR D:/scripts/ocr_android/opencv_release_armeabi/build)
find_package(OpenCV REQUIRED)
# openmp
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fopenmp")
add_library( # Sets the name of the library.
native-lib
SHARED
native-lib.cpp model.cpp)
find_library(
log-lib
log
android)
target_link_libraries( # Specifies the target library.
native-lib
ncnn
${OpenCV_LIBS}
android
jnigraphics
${log-lib})
Opencv4.1 & NDK21b
2.Android.mk 动态导入 Opencv 和 Ncnn
# Android.mk必须以LOCAL_PATH开头,注释#除外
# 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir)
OpenCV_BASE = ../libraries/OpenCV-android-sdk
NCNN_BASE = ../libraries/ncnn-android-lib
# 借助CLEAR_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量
include $(CLEAR_VARS)
LOCAL_MODULE := ncnn
LOCAL_SRC_FILES := $(NCNN_BASE)/arm64-v8a/libncnn.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE=SHARED
include $(OpenCV_BASE)/sdk/native/jni/OpenCV.mk
# 设置模块的名称,即编译出来.so文件名
# 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_MODULE := libFaceInterface
LOCAL_C_INCLUDES += $(OpenCV_BASE)/sdk/native/jni/include
LOCAL_C_INCLUDES += $(NCNN_BASE)/include/ncnn
LOCAL_STATIC_LIBRARIES += ncnn
LOCAL_CFLAGS := -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_CPPFLAGS := -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_LDFLAGS += -Wl,--gc-sections
LOCAL_CFLAGS += -fopenmp
LOCAL_CPPFLAGS += -fopenmp
LOCAL_LDFLAGS += -fopenmp
LOCAL_SRC_FILES := com_example_demo_SUANFA.cpp abstractFace.cpp Base64.cpp extractFaceFeatures.cpp face_detect.cpp factoryProcess.cpp image_quality_util.cpp libFaceAPI.cpp resAmFace.cpp
LOCAL_LDLIBS := -landroid -llog -ldl -lz
# 必须在文件结尾定义编译类型,指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
# BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用
# BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用
include $(BUILD_SHARED_LIBRARY)
Android静态导入 Opencv & NCNN
# Android.mk必须以LOCAL_PATH开头,注释#除外
# 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir)
OpenCV_BASE = ../libraries/OpenCV-android-sdk
NCNN_BASE = ../libraries/ncnn-android-lib
# 借助CLEAR_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量
include $(CLEAR_VARS)
LOCAL_MODULE := ncnn
LOCAL_SRC_FILES := $(NCNN_BASE)/arm64-v8a/libncnn.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE := STATIC
include $(OpenCV_BASE)/sdk/native/jni/OpenCV.mk
# 设置模块的名称,即编译出来.so文件名
# 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_MODULE := libFaceInterface
LOCAL_C_INCLUDES += $(OpenCV_BASE)/sdk/native/jni/include
LOCAL_C_INCLUDES += $(NCNN_BASE)/include/ncnn
LOCAL_STATIC_LIBRARIES += ncnn
LOCAL_CFLAGS := -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_CPPFLAGS := -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_LDFLAGS += -Wl,--gc-sections
LOCAL_CFLAGS += -fopenmp
LOCAL_CPPFLAGS += -fopenmp
LOCAL_LDFLAGS += -fopenmp
LOCAL_SRC_FILES := com_example_demo_SUANFA.cpp abstractFace.cpp Base64.cpp extractFaceFeatures.cpp face_detect.cpp factoryProcess.cpp image_quality_util.cpp libFaceAPI.cpp resAmFace.cpp
LOCAL_LDLIBS := -landroid -llog -ldl -lz
# 必须在文件结尾定义编译类型,指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
# BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用
# BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用
include $(BUILD_SHARED_LIBRARY)