久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Ubuntu系統(tǒng)下實(shí)現(xiàn)Android工程調(diào)用獨(dú)立編譯的C++程序和GMP,、PBC庫

 quasiceo 2018-08-05

目的:

  實(shí)現(xiàn)使用C++編寫代碼供Android工程調(diào)用,。C++代碼中可以使用STL庫,也可以使用常用的由源碼編譯生成的庫,,如PBC,。因?yàn)镻BC是基于GMP庫的,所以這里只記錄了GMP和PBC庫的編譯安裝方法,,其它庫的方法類似,。

特點(diǎn):

  不使用集成的ndk-build功能,,不需要在jni目錄下寫c文件和mk文件,,而是從NDK中提取出交叉編譯toolchain,這樣可以在CodeBlocks等環(huán)境中建立獨(dú)立工程進(jìn)行C++代碼的開發(fā),,然后編譯生成動態(tài)庫交給Android工程來加載,。

準(zhǔn)備工作:
  一個(gè)搭建好的Android開發(fā)環(huán)境(SDK),以及:
  android-ndk-r9d-linux-x86_64.tar.bz2
  gmp-6.0.0a.tar.bz2
  pbc-0.5.14.tar.gz
  這些都可以去各自的官網(wǎng)下載到,。

一,、搭建Android交叉編譯環(huán)境

  解壓ndk開發(fā)包,并提取其中的toolchain到指定目錄:

[plain] view plain copy
  1. $ cd android-ndk-r9d/  
  2. $ build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --platform=android-19 --system=linux-x86_64 --install-dir=$HOME/android-19-arm  

  參數(shù)說明:這里的toolchain參數(shù)指定的目標(biāo)是基于ARM的Android設(shè)備,,也可以根據(jù)需要改成基于x86或MIPS的Android設(shè)備,,具體的參數(shù)名可以參見android-ndk-r9d/toolchains目錄。參數(shù)platform設(shè)置為android-19,,指生成的工具鏈?zhǔn)轻槍ndroid 4.4版本的,,具體對應(yīng)關(guān)系可以查看android-ndk-r9d/docs/STABLE-APIS.html文件。參數(shù)system指的是本機(jī)系統(tǒng),,即運(yùn)行toolchain的環(huán)境,。這里將提取出來的toolchain安裝到了用戶主目錄下的android-19-arm文件夾,以后的工作都是在這個(gè)文件夾下進(jìn)行,,不再需要android-ndk-r9d目錄了,。

  為toolchain添加環(huán)境變量,,在文件/etc/profile的最后加上:

[plain] view plain copy
  1. # android toolchain  
  2. export TOOLCHAIN_HOME=$HOME/android-19-arm  
  3. export PATH=$TOOLCHAIN_HOME/bin:$PATH  

  然后最好注銷一次,使環(huán)境變量生效(也可以用source /etc/profile,,但好像只對本終端有效「注:elementary OS Luna」)

  測試:

[plain] view plain copy
  1. $ arm-linux-androideabi-gcc --version  


二,、配置Codeblocks開發(fā)環(huán)境

  打開Codeblocks,選擇Settings--Compiler,,選擇GNU GCC Compiler,,然后點(diǎn)Copy,這時(shí)會讓填寫新的編譯器的名字,,填寫GCC Toolchain For Android,。在Toolchain executables頁中,編譯器的安裝目錄選擇在第一步中創(chuàng)建的目錄(也就是$TOOLCHAIN_HOME所指向的目錄,,這里不能使用環(huán)境變量),,然后將下面的gcc、g++,、ar分別改成arm-linux-androideabi-gcc,、arm-linux-androideabi-g++和arm-linux-androideabi-ar,Debugger和Make不用改動,,保存,。

  現(xiàn)在已經(jīng)配置好了codeblocks環(huán)境,創(chuàng)建工程時(shí),,需要選擇剛才創(chuàng)建的編譯器,,編譯出來的程序才能在Android中運(yùn)行。

  可以新建一個(gè)名為testToolchain的控制臺程序來測試一下,,選擇GCC Toolchain For Android編譯器,,然后編譯出來的可執(zhí)行程序是Android系統(tǒng)上的原生C++程序,在x86平臺上是不能運(yùn)行的,,可以傳到手機(jī)上之后,,使用adb shell或在手機(jī)上安裝諸如BTEP終端來運(yùn)行。在Ubuntu上用file命令也可以查看文件的信息:

[plain] view plain copy
  1. $ file testToolchain  
  2. testToolchain: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped  

  可以看出,,的確是生成了arm平臺的目標(biāo)程序,。

三、使用Codeblocks來開發(fā)動態(tài)庫并交給Android工程調(diào)用

Android工程:

  在Android工程中(假設(shè)工程名為TestAndroidApp),,在需要調(diào)用C函數(shù)的地方聲明native函數(shù),,例如在MainActivity.java中聲明:

[plain] view plain copy
  1. public native String function_in_c_code();  

  運(yùn)行一下后生成對應(yīng)的class文件,然后打開終端,,切換到工程文件夾下的bin/classes目錄,,創(chuàng)建頭文件:

[plain] view plain copy
  1. $ javah com.example.testandroidapp.MainActivity  

  然后會在當(dāng)前目錄下生成com_example_testapp_MainActivity.h頭文件,里面有經(jīng)過java改造的C++函數(shù)的聲明方法,。

Codeblocks中:
  創(chuàng)建一個(gè)動態(tài)庫工程(Shared library),,假設(shè)工程名為cMainProc,,編譯器選擇GCC Toolchain For Android,完成,。這時(shí)應(yīng)該先把剛才在Android中聲明的接口函數(shù)實(shí)現(xiàn),,然后在接口函數(shù)中就可以隨意調(diào)用自己寫的其它函數(shù)或者庫了。在CPP文件中,,首先包含剛才使用javah命令生成的頭文件,。可以用相對路徑引用它,,也可以把頭文件復(fù)制到當(dāng)前工程中,。然后按照頭文件中的聲明來創(chuàng)建接口函數(shù),在剛才的例子中,,應(yīng)該創(chuàng)建這樣一個(gè)函數(shù):

[plain] view plain copy
  1. jstring JNICALL Java_com_example_testandroidapp_MainActivity_function_1in_1c_1code  
  2.   (JNIEnv *env, jobject)  
  3. {  
  4.     // todo: your code here.  
  5.     return env->NewStringUTF("Hello world.");  
  6. }  

  因?yàn)橛蟹祷刂?,所以在上面的代碼中加了一個(gè)env變量,并調(diào)用java中的方法創(chuàng)建了一個(gè)jstring類型的字符串返回,。

  可以通過直接包含相應(yīng)頭文件來使用STL庫,。如果需要使用其他通過源碼編譯的庫,那么需要先對其進(jìn)行交叉編譯,,然后將編譯后生成的頭文件和庫文件分別放到$TOOLCHAIN_HOME/sysroot/usr下的include和lib目錄中,,即可使用。頭文件直接包含即可,,庫文件最好使用對應(yīng)的靜態(tài)庫,。例如,使用PBC庫的話,,首先在代碼中#include <pbc/pbc.h>,,然后在工程的Link libraries里添加libgmp.a和libpbc.a,注意要帶上路徑,,這樣才會鏈接靜態(tài)庫,否則會使用動態(tài)庫,。

  編譯這個(gè)工程,,會在bin/Debug或bin/Release下生成對應(yīng)的libcMainProc.so文件。將這個(gè)文件復(fù)制到Android工程的libs/armeabi文件夾下(也可以修改Codeblocks工程的輸出目錄,,直接將編譯出來的so文件放到Android工程中,,這樣更方便)。

Android工程:
  在調(diào)用這個(gè)函數(shù)function_in_c_code()之前,,先加載剛才編譯的動態(tài)庫文件:

[plain] view plain copy
  1. static  
  2. {  
  3.         System.loadLibrary("cMainProc");  
  4. }  

  注意庫名中不帶“l(fā)ib”和擴(kuò)展名,,系統(tǒng)會自動尋找libcMainProc.so。然后就可以在java代碼中調(diào)用這個(gè)函數(shù)了:

[plain] view plain copy
  1. TextView t = (TextView)findViewById(R.id.textView1);  
  2. t.setText("String from c++: " + function_in_c_code());  

  運(yùn)行效果示例:

 

四,、編譯安裝GMP和PBC庫

  GMP庫的編譯稍復(fù)雜一些,,因?yàn)樵赾onfigure時(shí)要加上很多參數(shù),。解壓gmp-6.0.0a.tar.bz2,并按下面給出的參數(shù)執(zhí)行configure腳本,。如果有缺少的依賴項(xiàng),,則用apt-get安裝相應(yīng)的項(xiàng)后,重新執(zhí)行configure,,直到出現(xiàn)下面提示:

 

[plain] view plain copy
  1. $ ./configure --prefix=$TOOLCHAIN_HOME/sysroot/usr --enable-cxx --build=x86_64-pc-linux-gnu --host=arm-linux-androideabi MPN_PATH="arm/v6t2 arm/v6 arm/v5 arm generic" CFLAGS="-O2 -g -pedantic -fomit-frame-pointer -Wa,--noexecstack -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -march=armv7-a -mfloat-abi=softfp -mfpu=vfp"  
  2. ......  
  3. ......  
  4. configure: summary of build options:  
  5.   
  6.   
  7.   Version:           GNU MP 6.0.0  
  8.   Host type:         arm-unknown-linux-androideabi  
  9.   ABI:               standard  
  10.   Install prefix:    /home/user/android-19-arm/sysroot/usr  
  11.   Compiler:          arm-linux-androideabi-gcc -std=gnu99  
  12.   Static libraries:  yes  
  13.   Shared libraries:  yes  

 

  然后再編譯和安裝:

 

[plain] view plain copy
  1. $ make -j8  
  2. $ make install  

 

  PBC庫相對比較簡單,,解壓pbc-0.5.14.tar.gz,執(zhí)行configure后編譯并安裝(在./configure階段同樣需要安裝依賴項(xiàng)并重新./configure,,直到顯示成功):

 

[plain] view plain copy
  1. $ cd pbc-0.5.14  
  2. $ ./configure --prefix=$TOOLCHAIN_HOME/sysroot/usr --host=arm-linux-androideabi  
  3. ......  
  4. ......  
  5. global build variables  
  6. -----------------------------------------  
  7. Mon May 12 14:00:00 CST 2014  
  8. host info:        arm-unknown-linux-androideabi  
  9. optimized build:  no  
  10. compiler (CC):    arm-linux-androideabi-gcc  
  11. LDFLAGS:            
  12. CPPFLAGS:           
  13. CFLAGS:            -Wall -W -Wfloat-equal -Wpointer-arith -Wcast-align -Wstrict-prototypes -Wredundant-decls -Wendif-labels -Wshadow -pipe -ffast-math -U__STRICT_ANSI__ -std=gnu99 -fomit-frame-pointer -O3  
  14. LEX:              flex  
  15. AM_LFLAGS:          
  16. LFLAGS:             
  17. YACC:             bison -y  
  18. AM_YFLAGS:          
  19. YFLAGS:             
  20. -----------------------------------------  
  21. $ make -j8  
  22. $ make install  

  在使用PBC庫時(shí),,為了簡潔,建議鏈接PBC的靜態(tài)庫,,即libpbc.a,,同時(shí)要注意以下事項(xiàng):

  1. 使用靜態(tài)庫時(shí)一定要鏈接所有用到的靜態(tài)庫。PBC庫用到了GMP庫,,因此除了libpbc.a外,,還應(yīng)引用GMP的靜態(tài)庫,即libgmp.a

  2. 鏈接多個(gè)靜態(tài)庫時(shí),,一定要注意順序,,即最底層的庫排在最后面。在這里是PBC里用到了GMP的函數(shù),,因此需要先鏈接PBC,,再鏈接GMP,否則會出錯(cuò),。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多