1. 程式人生 > >Linux下編譯GitHub開源專案caffe-android-lib詳細教程

Linux下編譯GitHub開源專案caffe-android-lib詳細教程

目錄

一、背景

一、背景

要開發一款在Android平臺下的人臉識別軟體,需要用到Android Caffe框架跑模型,需要生成不同平臺(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64)下的.so檔案。大神專案原始碼 https://github.com/sh1r0/caffe-android-lib

二、準備工作

2.1 環境準備

按照要求,我們在ubuntu 16.04環境下安裝Android NDK r11c ,參考這篇部落格。安裝cmake 3.5.2,參考這篇部落格

2.2 下載專案

本地建立目錄(我是在/home目錄下),執行(沒有Git的自己先安裝一下)

git clone --recursive https://github.com/sh1r0/caffe-android-lib.git

等待半個小時。。。

2.3 修改C++檔案函式方法名

這一步可以說非常重要,因為你想生成的.so包是要放在自己的專案中的,而作為與JAVA native方法名對應的C++中的方法名,其格式是固定的,需要我們根據實際情況修改~

首先進入存放C++檔案的目錄

cd caffe-android-lib/caffe/android/

這時候你可以看到四個檔案 

我們只需要用vim編輯caffe_jni.cpp檔案,我們可以看到好幾個諸如下圖所示的方法,這是個JNI方法,其命名也是有規律的

JNIEXPORT void JNICALL
Java_com_sh1r0_caffe_1android_1lib_CaffeMobile_setNumThreads

com_sh1r0_caffe_1android_1lib對應的包名為 com.sh1r0.caffe.android_lib

CaffeMobile對應呼叫該native方法的類名,最後的setNumThreads與JAVA裡的native方法名一致

總結起來,這句話對應的是這麼個類

package com.sh1r0.caffe.android_lib;

/**
 * Created by shiro on 3/26/15.
 */
public class CaffeMobile {
    public  native void setNumThreads(int numThreads);
    //todo
}

所以,請你確認自己的JAVA類名以及包名,比如我要編譯的自己的類為

package ch.zhaw.facerecognitionlibrary.Helpers;

public class CaffeMobile {
    public  native void setNumThreads(int numThreads);
}

那麼我就會將C++檔案中的字串

Java_com_sh1r0_caffe_1android_1lib_CaffeMobile

替換為

Java_ch_zhaw_facerecognitionlibrary_Helpers_CaffeMobile

為了方便替換,可以在vim中執行以下命令統一替換

%s/Java_com_sh1r0_caffe_1android_1lib_CaffeMobile/Java_ch_zhaw_facerecognitionlibrary_Helpers_CaffeMobile/g

儲存退出即可

2.4 設定環境變數

以x86為例

export ANDROID_ABI=x86 #可選項 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64
export NDK_ROOT=/path/to/ndk  #如果你參考我的部落格進行安裝,目錄就是/opt/ndk/android-ndk-r11c

三、編譯專案

3.1 執行編譯指令碼

cd caffe-android-lib
./build.sh

如果。。。你沒有遇到任何問題,看到了   Done!!  那麼恭喜你,中獎了~~請忽略以下步驟直接跳到步驟四

如果很遺憾,編譯退出,報錯如下圖所示

那麼恭喜你,遇到了我~

接下來,請認真跟我操作

3.2 拷貝缺失檔案

其實上圖報錯的檔案是有的,已經生成了,為什麼沒有找到呢?感覺是作者寫的指令碼可能忘了把生成的檔案移動到指定路徑,先不管了,我們自己動手,豐衣足食~

(1)首先確認你所在的路徑在caffe-android-lib/下

[email protected]4dcjfjhi42Z:/home/caffe-android-lib#

(2)進入OpenBLAS目錄

cd OpenBLAS/

這時候你執行檢視命令 ll

你會發現有個檔名字很像我們要找的—— libopenblas_atomp-r0.2.18.a,多了個p,但是沒關係,直接用它就可以~

(3)拷貝到對應目錄

現在,執行命令

cp libopenblas.a /home/caffe-android-lib/android_lib/openblas/lib/
cp libopenblas_atomp-r0.2.18.a /home/caffe-android-lib/android_lib/openblas/lib/

細心的你發現了,我把兩個檔案都拷貝到了caffe-android-lib/android_lib/openblas/lib/目錄下

我們還需要拷貝幾個檔案

執行以下命令,把lapack-netlib/LAPACKE/include目錄下的檔案都拷貝到指定路徑下

cp -r lapack-netlib/LAPACKE/include/. /home/caffe-android-lib/android_lib/openblas/include/

可以看一下拷貝了哪些檔案

拷貝後的檔案關係,綠框中為新拷貝的檔案

3.3 修改編譯指令碼

因為Openblas已經編譯過了,所以我們要將build.sh指令碼中相關內容註釋掉

執行cd .. 回退進入到caffe-android-lib/目錄

vim修改指令碼,註釋如圖所示的幾行,儲存退出

3.4 再次編譯指令碼

執行 ./build.sh,等待編譯完成

這次編譯大概要花10多分鐘。。。慢慢等

四、編譯完成

編譯好的.so檔案在caffe-android-lib/android_lib/caffe/lib/下,如下圖所示

至此大功告成~怎麼取出來?自己想辦法吧,反正我是用的XX雲主機上的Ubuntu,用xshell的xftp工具直接下載下來了~