最近開發中,需要對圖片做一些處理與線性技術,這時就用到了Ceres Solver。如何把Ceres Solver集成到Android里呢? 官網給了一個解決方案,簡潔明了:
Download the Android NDK version r9d or later. Run ndk-build from inside the jni directory. Use the libceres.a that gets created.(意思是:下載NDK r9d 或更新版本,然后進入 下載最新ceres-solver包的jni目錄里,運行ndk-build 得到 libceres.a 靜態包)
步驟如下:
1、添加NDK的環境變量,不懂的可以搜索安裝教程。
2、運行 =》cmd,打開命令行窗口, cd 進入到下載ceres-solver包的jni目錄里,運行 ndk-build
報:jni/Android.mk:80: *** Ceres requires NDK version r9d or greater . Stop. 錯誤!
查看 Android.mk 80 行,可以知道它是判斷當前NDK的版本,運行了 jni 目錄下的shell腳本(assert_ndk_version.sh)。
但是我發現我的NDK已經是最新了,為什么還報這異常呢? 查看當前的NDK版本,
可以點擊這。
認真查看了 assert_ndk_version.sh 文件的內容,發現,它是查找NDK根目錄下的一個叫 RELEASE.TXT 文件, 但我們沒有。所以新建一個, 然后在里面加入 r14b (64-bit) (替換成你的NDK版本)
在MAC 系統上可以跑通,在windows 上還會繼續報上面的錯誤,因為windows 不能直接跑shell腳本。 直接了當,Android.mk 79—81行 用 # 注釋掉。 然后就會編譯出 libceres.a 靜態文件。
但是這樣編譯出來的靜態文件,在運用的時候,還是會報錯,打開 ceres-solver包的jni目錄下的
Application.mk文件,可以看到:
APP_CPPFLAGS += -fno-exceptions
APP_CPPFLAGS += -fno-rtti
APP_STL := c++_static
| 名稱 | 說明> | 功能 |
| libstdc++(默認) | 默認最小系統 C++ 運行時庫。 | 不適用 |
| gabi++_static | GAbi++ 運行時(靜態)。 | C++ 異常和 RTTI |
| gabi++_shared | GAbi++ 運行時(共享)。 | C++ 異常和 RTTI |
| stlport_static | STLport 運行時(靜態)。 | C++ 異常和 RTTI;標准庫 |
| stlport_shared | STLport 運行時(共享)。 | C++ 異常和 RTTI;標准庫 |
| gnustl_static | GNU STL(靜態)。 | C++ 異常和 RTTI;標准庫 |
| gnustl_shared | GNU STL(共享)。 | C++ 異常和 RTTI;標准庫 |
| c++_static | LLVM libc++ 運行時(靜態)。 | C++ 異常和 RTTI;標准庫 |
| c++_shared | LLVM libc++ 運行時(共享)。 | C++ 異常和 RTTI;標准庫 |
c++_static 我們平常比較少用到(因為我不熟悉C/C++),所以將上述三個參數改為:
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
然后ndk-build,得到一個正確的 libceres.a 靜態文件。 (歡迎留言討論)
參考資料: http://tech.sandyeggi.com/2013/10/using-ceres-solver-in-android-ndk.html
我編譯好的ceres-solver 項目 http://pan.baidu.com/s/1bo3ENoj
