Android中CMake的使用之四呼叫第三方庫的實戰
繼續上回中第三方庫的呼叫,在實際的工程中要使用一個演算法的SO庫(也提供了.a),然後就按上述的方法進行了呼叫。結果在這個過程中出現了一些新的問題。
首先,在呼叫的時候兒在CMakeLists.txt新增好相關的SO後:
add_library( # Sets the name of the library. XXX # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). IMPORTED)
編譯時發現這樣一個問題“XXX庫得需要相關的native-lib庫,沒有生成..//..//mips64//native-lib的相關規則”之類的,去生成路徑下查詢,果然沒有這個本地庫,可要是把這個新增的庫在CMakeLists.txt去除,就沒有了問題。這個折騰了有一兩個小時,後來突然明白,會不會是給的庫中版本不全,然後就開始試。
演算法給的庫,只有四個版本,arm64-v8a,armeabi-v8a,x86,x86_64,在使用之三的生成的庫中進行測試,去除了一個mips64相關的第三方庫,果然報相關的錯誤,好。這就說明,只要控制好自己的版本生成,在編譯過程中不生成上述四種以外的庫就可以了。當然小於這四種也可以。
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.fjf.testfacealgo" minSdkVersion 17 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -fexceptions" arguments "-DANDROID_STL=c++_static" } } ndk{ abiFilters "arm64-v8a", "armeabi-v7a"} } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "CMakeLists.txt" } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' }
重點是上面的紅色的abiFilters部分,這裡只生成了兩種,果然就不再報這個錯誤了。但是又出現了下面這個錯誤
“nomember named 'to_string' in namespace 'std'”
也是醉了。用個STL還都不行了。這個也用了不少時間,因為這種錯誤很少,後來在STACKOVERFLOW中發現了端倪,有人說NDK中預設使用的是最小的STL庫,於是就會產生這種現象,深以為是。於是從谷歌的官網上查到NDK中的配置,配合在STACKOVERFLOW上的解決方案,終於明白了怎麼回事兒。
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake build script.
externalNativeBuild {
cmake {
...
// Use the following syntax when passing arguments to variables:
// arguments "-DVAR_NAME=VALUE"
// ------------------- ANSWER -------------------
arguments "-DANDROID_STL=c++_shared"
}
}
}
buildTypes {...}
// Use this block to link Gradle to your CMake build script.
externalNativeBuild {
cmake {...}
}
}
仍然是看紅色部分,但是細節的可能看到這裡的紅色部分和上面更全的使用的不一樣啊,這裡用的C++_shared,而上面使用的c++_static,那就得看下面兩個網頁了:
在ANDROID_STL選項中可以點選跳轉到指定頁面的說明:
名稱 |
說明> |
功能 |
GAbi++ 執行時(靜態)。 |
C++ 異常和 RTTI |
|
GAbi++ 執行時(共享)。 |
C++ 異常和 RTTI |
|
STLport 執行時(靜態)。 |
C++ 異常和 RTTI;標準庫 |
|
STLport 執行時(共享)。 |
C++ 異常和 RTTI;標準庫 |
|
GNU STL(靜態)。 |
C++ 異常和 RTTI;標準庫 |
|
GNU STL(共享)。 |
C++ 異常和 RTTI;標準庫 |
|
LLVM libc++ 執行時(靜態)。 |
C++ 異常和 RTTI;標準庫 |
|
LLVM libc++ 執行時(共享)。 |
C++ 異常和 RTTI;標準庫 |
都安排好了,再編譯,還是報SO依賴的問題,結果在走查後發現了一個更悲催的問題,庫的名字寫錯了,這種低階的錯誤,導致了一系列的問題啊。
同樣,在新增庫的路徑時,也遇到了在第三篇部落格中遇到的各種問題,值得說明的是CMAKE_SOURCE_DIR,這個在向上寫相對路徑時,無法使用,一定得記清。
更悲催的是,還把庫的位置書寫路徑,寫到了其它的配置項內,大錯特錯了。
用的還是少,做得還是不多,這才是這些錯誤的根本。
相關推薦
Android中CMake的使用之四呼叫第三方庫的實戰
繼續上回中第三方庫的呼叫,在實際的工程中要使用一個演算法的SO庫(也提供了.a),然後就按上述的方法進行了呼叫。結果在這個過程中出現了一些新的問題。 首先,在呼叫的時候兒在CMakeLists.txt新增好相關的SO後: add_library( # Sets the na
Android問題集錦之八 呼叫其他程式中的activity和Permission Denial starting I
今天想除錯多個task中棧的情況,在測試程式中呼叫另一個程式的activity,程式碼片段如下: btnStartX=(Button)findViewById(R.id.btnStartX); btnStartX.setOnClickListener
android呼叫第三方庫——第二篇——編寫庫android程式直接呼叫第三方庫libhello.so
0:前言 1:本文主要作為丙方android公司的身份來寫 2:作者有不對的地方,請指出,謝謝 1:場景:公司接到任務,說配合乙方C++公司開發android識別程式,專案佈置到專案經理,然後經理把任務交給你來做,你自然是先抱怨一番,活多錢少讓我這新人來幹,哎沒辦法啊
android呼叫第三方庫——第一篇
0:前言: 這兩天一直在研究用android的jni呼叫第三方庫,上網搜方法,但是都是泛泛而談,沒有demo,經過我幾番折磨,寫了n多的helloword工程,總是不成功,工程名字也就由helloowrd轉到shithelloword再轉到fuckhelloword再轉到
Roboware studio中呼叫第三方庫修改CMakelist
相信剛開始接觸到CMakelist.txt的時候,肯定是摸不到頭緒的;現在我就針對我在工程遇到的問題和解決方法分享給你們,希望對你們的學習有幫助。我遇到的問題是在src檔案->XXX.cpp原始檔中呼叫,include->XXX檔案->xxx.cpp裡的實現
Android 7.0呼叫第三方庫出現載入失敗的問題
在Android7.0 ,自己編譯的APK放到系統裡,呼叫第三方庫沒有問題,但是通過SD卡點選apk檔案安裝,就出現 java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libxxx.
android可以嘗試的25個第三方庫
Lottie 這是一個動畫庫。通過Adobe After Effects做出動畫效果,然後通過Bodymovin(AE的外掛)匯出JSON資料,然後通過該庫生成原生動畫效果。 Github地址:https://github.com/airbnb/lottie-android 效果圖如下:
Qt Creator 呼叫第三方庫libZPlay 解析音訊檔案 標題、專輯、檔名、藝術家
libZPlay libZPlay庫集成了所有支援格式(mp3, mp2, mp1, ogg, flac, ac3, aac, oga, wav and pcm )的編碼解碼器。 一、官網下載sdk http://libzplay.sourceforge.net/ 二、pro檔案修改:
Android開發技巧之:QQ第三方登入(二)
接 android QQ第三方登入(一) 獲取登入使用者名稱資訊,這邊先抱怨一下,官方API有點坑 Constants原始碼類下就是找不到GRAPH_SIMPLE_USER_INFO這個屬性!無語! 根據官方提供返回的的JSONObject資訊解析:
Android開發技巧之:QQ第三方登入(一)
使用的是Android_SDK_V2.9.1,建議使用最新版; 官方下載:SDK下載 Android studio 中新增到 然後在點選build.gradle檔案新增 配置AndroidManifest 在應用的Andr
Java中支援深淺拷貝的第三方庫
深拷貝 Apache旗下的Commons-Lang3包有一個序列化的工具SerializationUtils,可以做深拷貝。 當然前提是你的類實現了序列化介面。 Java Deep Cloning Library是我覺得最好用的一個。它的深拷貝通過反射實現,適合用於你 不能控制的第三方類或者沒有實現序
SLAM學習--視覺SLAM十四講第三方庫安裝
echo "安裝eigen3" sudo apt-get --yes --force-yes install libeigen3-dev cd ~/ThirtyLib echo "安裝Sopus" g
Android中UI之對齊方式
UI中的對齊方式: 一、LinearLayout(線性佈局) 提供了控制元件水平垂直排列的模型,同時可以通過設定子控制元件的weight佈局引數控制各個控制元件在佈局中的相對大 小。 水平(vertical)垂直(horizontal) fill-parent:佔滿整個螢幕 wr
Android WebView的使用及呼叫第三方瀏覽器開啟網頁
1.編寫佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app
[RK3399][Android7.1] 除錯筆記 --- 預編譯呼叫第三方庫
Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 背景: 現在在Framework層及以下經常會呼叫到第三方的C++演算法庫,比如語音識別,人臉識別等等。
【已解決】python之pip安裝第三方庫連結超時
在python中利用pip直接下載第三方庫進行安裝時發生瞭如圖所示bug(注:第三方庫連線超時): 原因是連線超時,所以需要自己設定安裝源,即:通過什麼映象安裝。 解決方法: 在 pip命
Android 經典筆記之四: 事件衝突解決思路與方案
事件衝突解決思路與方案 目錄介紹 1.事件機制簡單介紹 1.1 觸控事件 1.2 分發事件 1.3 攔截事件 2.解決滑動衝突的思路及方法 2.1 第一種情況,滑動方向不同 2.2 第二種情況,滑動方法相同 2.3 第三種情況,以上兩種情況巢狀 3.案例解決方法
Android中的Activity四種啟動模式(launchMode)(面試必問)
android:launchMode standard 預設標準的啟動模式,每次startActivity(Intent intent)請求都建立一個新的activity實 例,適用於大多數場景。 singleTop 單一頂部,如果要啟動的activity在任務棧的頂部已經存在,不會建立新的例項,而是呼叫 o
Android中常用的四種點選事件
1.匿名內部類的方式 findViewById(R.id.btn_submit).setOnClickListener(new View.OnClickListener() { @Override public
VS2013+Qt5.7.1呼叫第三方庫
描述:由於專案需求,需要呼叫第三方庫。手上的資料有,dll,lib,.h檔案。開發環境:VS2013+Qt5.7.1 理論上來說,直接用VS呼叫靜態庫方法既可以正常呼叫,最終結論也沒錯,但中間出現一些問題。如下圖: 檢查了,連結lib路徑無誤,然後用win32窗體程式呼叫