導語
前面的章節已經把NanoMsg的簡介,及C#相關的NNanoMsg使用Demo已經介紹完成了,今天這篇開始我們就要寫關于Android怎麼使用NanoMsg的文章,自己在網上搜了好久,發現Android中并沒有已經封裝好的NanoMsg的好用的包,是以我們就隻能自己來實作了,相比C#中要麻煩的多。
Android實作NanoMsg方式
實作步驟
- 下載下傳NanoMsg的源碼,利用NDK的方式編譯源碼生成對應的動态連結庫(.so)檔案。
- 在NDK項目中,我們通過C++調用編譯好的NanoMsg的動态庫,再利用JNI的方式JAVA或是Kotlin進行調用。
其實上面兩步可以在一個NDK項目中實作,不過我采用的還是先編譯好NanoMsg的動态庫方式,如果說NanoMsg本身更新了,這樣我們重橷編譯一下新的源碼生成相同名稱的動态庫即可,封裝調用JNI這些就不用再動代碼了。
NanoMsg代碼編譯
微卡智享
Android的NDK使用
前面的在Android Studio中使用NDK,可以參考我以前的文章《Android NDK程式設計(一)---NDK介紹及環境搭建》
01
下載下傳源碼
NanoMsg的源碼位址:https://github.com/nanomsg/nanomsg.git

我們下載下傳解壓後在本地
02
建立NDK項目
打開Android Studio新建立一個C++的項目,起名為makenanomsglib
建立好後的項目我們可以看到左邊會有CPP的檔案夾和裡面的CMakeLists.txt的檔案
03
複制源碼
找到項目CPP檔案夾的目錄,我們需要把下載下傳完的NanoMsg的源碼複制進CPP的檔案夾中。
04
修改CMakeLists檔案
這一步是一個重點,在NanoMsg中的源碼裡有一個CMakiList的檔案,我們如果直接拷過來替換自己的CMakeList是沒用的,而且我們是要編譯成動态庫,是以裡面部分内容我們需要引用,然後自己修改一下。
首先用到的就是設定所有NanoMsg的相關C的檔案,把這個整個複制過來,但是因為我們拷貝的路徑是在src下,是以根據我們自己的Cmakelist我們的路徑前面都要加上src,如下
再看看NanoMsg本身的CmakeList中,下面這塊是所對應的系統的,這樣我們就不需要考慮這塊了
再下面我們看到他有判斷NN_HAVE_EPOLL的,其實這個就是我們要定義的CFlag,這塊在源碼中有看到,但是還沒了解,是以我們這塊直接在我們的CMakeList中定義,定義的方法就像下圖中的add_definitions(-XXXXX)
把這幾個修改一下在我們的CMakelist中加入,記得要加入前面的src/
再下面這塊與上面的處理一樣
我們改完後的效果是
到這裡原來NanoMsg中Cmakelist我們需要用到的就可以了,接下來我們要修改自己的CMakelist後面的,比例生成的動态庫名什麼的這些了
然後下面的連結動态庫這裡我們也把需要連結庫中也改為我們剛才定義的nanomsg的動态庫名
基本這樣就差不多了,接下來我們編譯一下看看,其實寫這個文章之前我已經編譯成功了一次,再重建這個主要是為了把過程中遇到的問題再重新走一遍,這樣記憶更深,接下來我們編譯一下看看。
編譯過程中的問題
微卡智享
Rebuild Project後直接報了個錯
選擇File---Project structure,然後在SDK Location中把Android NDK Location選擇好我們自己已經下載下傳好的NDK
設定好後我們重新編譯,結果還是這個問題,然後我就看了一下build.gradle中cmake的設定,可能我自己機器裝了Cmake3.10的版本,所在這裡面有一個版本号的問題,網上查了一下說是Android中編譯這個用3.6以上的版本會有問題,是以我們把這行删除了後再編譯
删除後重新編譯完後就不報剛才的問題了,不過又出現了新的問題
no member named 'msg_accrights' in 'struct msghdr'
在網上找了一下資料,發現是socket.h中本身的結構體的定義,應該是版本不同的引的的也不一樣了,我們需要加上一個CFlag的定義
#設定socket.h中的結構體定義,如果沒有這個提cmake中一直會報錯
add_definitions (-DNN_HAVE_MSG_CONTROL)
複制
這樣我們再重新Make Project就完全成功了
最後要編譯一下動态庫,選擇Build--Build Bundle(s)/APK(s)--Build APK(s)
生成後的動态庫就在app\build\intermediates\cmake\debug\obj下面,對應着不同的處理器架構
這樣我們NanoMsg源碼編譯的動态庫就完成了,照着上面的順序做應該是沒有問題的,看着還是挺簡單的,不過因為我也是初學者,是以花了我大約三天的時間才搞明白這塊,不過總算是有收獲的。
後面文章我們介紹一下C下面的Nano的相關函數和Android的調用與前面C#的通訊。
最近還是會把相關的Demo上傳上來,敬請期待!
完