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工具直接下載下來了~