1:编译
如果需要在Android下使用openblas,则需要编译Android版本的openblas.a文件进行调用。
1:openblas的编译时主要参考链接:
ps:如果没有特殊要求,可以选择已经编译好的Android版本,armV8版本目前没有编译好的,有需要的话需要自行编译,编译过程挺繁琐,完全没必要去采坑:
链接地址:目前支持armV7和armV6
2:ndk编译中Android使用
APP_ABI := armeabi-v7a
APP_STL := gnustl_static
APP_PLATFORM := android-18
NDK_TOOLCHAIN_VERSION := 4.9
LOCAL_PATH := $(call my-dir)
LOCAL_PREBUILT_DIR := prebuilt
#加入依赖项,openblas相关
include $(CLEAR_VARS)
LOCAL_MODULE := openblas
LOCAL_SRC_FILES :=$(LOCAL_PREBUILT_DIR)/openblas/lib/libopenblas.a
include $(PREBUILT_STATIC_LIBRARY)
#加入依赖项,一个预编译文件
include $(CLEAR_VARS)
LOCAL_MODULE := cvface_api
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libcvface_api.so
include $(PREBUILT_SHARED_LIBRARY)
#加入依赖项,部分修改的源文件
include $(CLEAR_VARS)
LOCAL_MODULE := jni_cvface_api
LOCAL_SRC_FILES += common.cpp \
com_sensetime_faceapi_CvFaceLibrary.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(LOCAL_PREBUILT_DIR)/include
# 加入本模块编译依赖的模块,openblas和cvface_api
LOCAL_STATIC_LIBRARIES := openblas
LOCAL_SHARED_LIBRARIES := cvface_api
LOCAL_LDLIBS := -llog -ljnigraphics
LOCAL_LDFLAGS += -Wl,--gc-sections
include $(BUILD_SHARED_LIBRARY)
- 编译带有openblas支持的本项目的目录结构:
报错相关:
- 1.调用问题:JNI和java层调用相关,老是提示
No implementation found for int com.st.faceapi.CvFaceLibrary.cvFaceGetFeatureMulitArray(float[][], float[])
-
解决方案:
LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp
这样导致,虽然实现了,但是接口是找不到的,因为后一个将前一个覆盖了,故而更改为:
LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp
问题得到解决
-
2:报错描述:
- 出现了一种错误,在使用ndk编译时,并没有报出任何错误,在程序运行时,也并未提示说明,接口的缺失,但是,程序就是不停的在运行,无法显示最终的测试结果
-
解决方案:
- 逐个排查,java层没有问题,最终发现是jni层部分代码写错了,出现一些未知定义和未知语法,令人奇怪的是,这些错误在使用ndk编译时是发现不了的。jni新增代码逐行注释,删除有问题代码即可。
ps:参考链接
1:openblas中有不少相关的编译指导,打开后的侧边栏:
https://github.com/xianyi/OpenBLAS/wiki
2:ndk 编译参考链接:
http://blog.csdn.net/smfwuxiao/article/details/8523087
3:ndk编译中,Android.mk各个参数配置信息的含义:
https://developer.android.com/ndk/guides/android_mk.html#var
4:百度网盘链接:
链接:https://pan.baidu.com/s/1pWLxQcFoOFz7kQnXaCwtsA
提取码:eb87