1. 程式人生 > >Android中CMake的使用之四呼叫第三方庫的實戰

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,這個在向上寫相對路徑時,無法使用,一定得記清。
更悲催的是,還把庫的位置書寫路徑,寫到了其它的配置項內,大錯特錯了。

用的還是少,做得還是不多,這才是這些錯誤的根本。

相關推薦

AndroidCMake的使用呼叫第三方實戰

繼續上回中第三方庫的呼叫,在實際的工程中要使用一個演算法的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

AndroidUI對齊方式

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++演算法庫,比如語音識別,人臉識別等等。

【已解決】pythonpip安裝第三方連結超時

在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窗體程式呼叫