Ceres Solver for android


    最近開發中,需要對圖片做一些處理與線性技術,這時就用到了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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM