本文最后更新于:2023年4月15日 下午
Android NDK 使用.a
一个编译时使用.a文件的例子。流程是准备好库文件以及对应的头文件,编写makefile,编译。
准备库文件与头文件
先准备头文件和.a
文件。这里以ncnn目录为例。
1 2 3 4 5 6 7 8
| |-- Android.mk |-- Application.mk |-- ncnn | |-- include | | |-- benchmark.h | | |-- ....h # 对应的头文件 | |-- lib | | `-- libncnn.a
|
编写makefile
在Android.mk
中声明库文件。
这里是引入opencv的库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := ncnn LOCAL_SRC_FILES := ncnn/lib/libncnn.a include $(PREBUILT_STATIC_LIBRARY)
LOCAL_STATIC_LIBRARIES := ncnn
OPENCVROOT:=$(LOCAL_PATH)/../../../../../../OpenCV-android-sdk OPENCV_CAMERA_MODULES:=off OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=STATIC include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := v20/fdssttracker.cpp v20/fhog.cpp v20/runtracker.cpp \ jni_eman.cpp \ ncnn/ssdmobilenet.cpp jni_encnn.cpp
|
这里要注意,头文件和.a文件必须是对应的。否则编译时会报错error: undefined reference to
1 2 3 4 5 6 7
| E:/projects/myProj/myProject/f1/src/main/jni/ncnn/lib/libncnn.a(net.cpp.o):net.cpp:function ncnn::Net::load_model(__STDIO_FILE_STRUCT*): error: undefined reference to 'stderr' E:/projects/myProj/myProject/f1/src/main/jni/ncnn/lib/libncnn.a(net.cpp.o):net.cpp:function ncnn::Net::load_model(char const*): `error: undefined reference to` 'stderr' E:/projects/myProj/myProject/f1/src/main/jni/ncnn/lib/libncnn.a(net.cpp.o):net.cpp:function ncnn::Net::load_model(unsigned char const*): error: undefined reference to 'stderr' E:/projects/myProj/myProject/f1/src/main/jni/ncnn/lib/libncnn.a(net.cpp.o):net.cpp:function ncnn::Net::find_blob_index_by_name(char const*) const: error: undefined reference to 'stderr' clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [E:/projects/myProj/myProject/f1/src/main/obj/local/armeabi-v7a/libf1.so] Error 1
|