openblas 第二弹: openblas Android版调用和编译

1:编译

如果需要在Android下使用openblas,则需要编译Android版本的openblas.a文件进行调用。

1:openblas的编译时主要参考链接:

  • 参考链接一

  • 参考链接二

  • 具体细节太久了,已经忘了,下面是编译好的时候的环境变量:

    • export PATH=/tmp/my-android/bin:$PATH
    • export NDK=home/sbb/tools/android-ndk-r14b
    • export SYSROOT=$NDK/platforms/android-19/arch-arm

ps:如果没有特殊要求,可以选择已经编译好的Android版本,armV8版本目前没有编译好的,有需要的话需要自行编译,编译过程挺繁琐,完全没必要去采坑:

链接地址:目前支持armV7和armV6

2:ndk编译中Android使用

  • 关于如何配置ndk 使得其能够编译,下面的链接说的非常清楚

    链接地址

  • Android.mk 和 Application.mk具体配置

    • 其中的Application.mk定义了具体的,目标编译架构,平台和Android版本
APP_ABI := armeabi-v7a
APP_STL := gnustl_static

APP_PLATFORM := android-18
NDK_TOOLCHAIN_VERSION := 4.9
  • 其中的Android.mk定义了编译顺序,编译的源文件,依赖等等,如下给出配置的各种含义:

    • LOCAL_PATH := $(call my-dir)
      • 获取ndk编译时的当前路径
    • include $(CLEAR_VARS)
      • 清除以LOCAL_** 为开头的变量,例如LOCAL_MODULE, LOCAL_SRC_FILES, and LOCAL_STATIC_LIBRARIES
    • LOCAL_MODULE := hello-jni
      • 自动加上lib,生成一个libhello-jni.so文件
    • include $(BUILD_SHARED_LIBRARY)
      • 构建系统生成一个.so 文件
    • include $(BUILD_STATIC_LIBRARY)
      • 构建系统生成一个.a 文件
    • include $(PREBUILT_SHARED_LIBRARY)
      • 包含一些预编译文件"*.so"
    • 如下是项目中的具体配置,依赖两个文件,最终将生成两个目标文件:
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支持的本项目的目录结构:
    openblas 第二弹: openblas Android版调用和编译_第1张图片

报错相关:

  • 1.调用问题:JNI和java层调用相关,老是提示
No implementation found for int com.st.faceapi.CvFaceLibrary.cvFaceGetFeatureMulitArray(float[][], float[])
  • 解决方案:

    • 常规方案:(1)在使用jni编译的文件和java相互调用时,经常出现接口找不到,首先需要查看在java代码的定义和jni中定义的参数和名称是否相同。

    • (2)jni接口无法找到:

      参考链接

    • 最终原因是在编译的Android.mk出现错误,在同一个模块出现:

    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

你可能感兴趣的:(计算加速)