加密芯片是一種專門設(shè)計(jì)用于保護(hù)信息安全的硬件設(shè)備,它通過內(nèi)置的加密算法對數(shù)據(jù)進(jìn)行加密和解密,以防止敏感數(shù)據(jù)被竊取或篡改。如下圖HD-RK3568-IOT工控板,搭載ATSHA204A加密芯片,常用于有安全防護(hù)要求的工商業(yè)場景,下文將為大家介紹安卓APP開發(fā)中,如何使用此類加密芯片。

1.AndroidStudio工具配置
JNI(JavaNativeInterface,Java本地接口)是Java生態(tài)的特性,它擴(kuò)展了Java虛擬機(jī)的能力,使得Java代碼可以與C/C++代碼進(jìn)行交互。通過JNI接口,Java代碼可以調(diào)用C/C++代碼,C/C++代碼也可以調(diào)用Java代碼。雖然Java是平臺無關(guān)性語言,但運(yùn)行Java語言的虛擬機(jī)是運(yùn)行在具體平臺上的,所以Java虛擬機(jī)是平臺相關(guān)的。因此,對于調(diào)用平臺API的功能時(shí),雖然在Java語言層是平臺無關(guān)的,但背后只能通過JNI技術(shù)在Native層分別調(diào)用不同平臺API。類似的,對于有操作硬件需求的程序,也只能通過C/C++實(shí)現(xiàn)對硬件的操作,再通過JNI調(diào)用。為了支持JNI的開發(fā),在AndroidStudio工具中需要NDK(NativeDevelopmentKit)的支持。

圖1.1:添加NDK和CMake支持
點(diǎn)擊AndroisStudio的File->settings菜單,打上上面的settings頁面,首先找到AndroidSDK的設(shè)定位置,AndroidStudio版本不一樣時(shí),其AndroidSDK所處的子項(xiàng)可能略有差異,然后點(diǎn)擊SDKTools頁簽,勾選上NDK和CMake的支持,然后安裝它們。
2.新建NativeC++工程
點(diǎn)擊File->Newproject,然后選中“NativeC++”工程模板,創(chuàng)建一個(gè)C++工程。最后點(diǎn)擊“Next”按鈕,如下圖所示:

圖2.1:新建NativeC++項(xiàng)目
接著填寫工程的名字,包名,工程保存的位置以及語言,然后點(diǎn)擊“Next”按鈕,如下圖所示:

圖2.2:native項(xiàng)目設(shè)置
接著進(jìn)行C++標(biāo)準(zhǔn)設(shè)定,這里可以根據(jù)熟悉的語言標(biāo)準(zhǔn)進(jìn)行選擇,最后點(diǎn)擊“Finish”完成設(shè)定。

圖2.3:C++Standard選擇
完成后,新建的項(xiàng)目窗口如下:

圖2.4:新建項(xiàng)目全貌
導(dǎo)航欄作用可以通過左側(cè)項(xiàng)目工具視圖體現(xiàn),菜單欄也可以先隱藏而在需要時(shí)顯示,為使窗口空間的有效利用,通過View->Appearance將菜單欄隱藏,并將導(dǎo)航信息設(shè)定為在下方的StatusBar中顯示。
3.Native項(xiàng)目開發(fā)
3.1CPP開發(fā)
在窗口的左側(cè)邊沿是一條“ToolWindowBar”,用于選擇左側(cè)窗口“ToolWindow”的內(nèi)容,在窗口的左上角有一個(gè)

圖標(biāo),表示“ToolWindow”顯示為項(xiàng)目,點(diǎn)擊該圖標(biāo)會(huì)有不同的視圖選擇,這里默認(rèn)是“Android”視圖,現(xiàn)在點(diǎn)擊“Android”標(biāo)簽,在下拉視圖選項(xiàng)中選擇“ProjectFile”視圖:

圖3.1:項(xiàng)目視圖選擇

圖3.2:ProjectFiles顯示
cryptosdr/app/src/main/AndroidManifest.xml是一個(gè)清單文件,在每個(gè)android應(yīng)用項(xiàng)目必有的,它負(fù)責(zé)向Android構(gòu)建工具,此文件是自動(dòng)生成的。cryptosdr/app/src/main/java/com/vanxoak/cryptosdr/MainActivity.java是描述程序邏輯的java文件。cryptosdr/app/src/main/cpp下面有兩個(gè)文件,是我們要進(jìn)行nativec++開發(fā)的地方:CMakeLists.txt:編譯腳本,用于告知如何編譯項(xiàng)目中的本地庫。native-lib.cpp:創(chuàng)建的本地庫示例代碼模板,后期代碼編寫主要在這個(gè)文件里面進(jìn)行。現(xiàn)在分別詳細(xì)介紹一下這兩個(gè)文件,CMakeLists.txt解釋如下:
cmake_minimum_required(VERSION3.22.1)#設(shè)置Cmake的最低版本
navtive-lib.cpp文件,這個(gè)文件是本地庫的C++源碼。我們需要在這里定義本地庫對java(Android)層提供的接口。在java中調(diào)用我們定義和提供的接口,就能實(shí)現(xiàn)java操縱c++的能力,這里是自動(dòng)生成的一個(gè)示例:
#include
我們需要對navtive-lib.cpp實(shí)現(xiàn)的內(nèi)容進(jìn)行修改,上面給了一個(gè)范例,我們也可以通過其它的方式讓這個(gè)文件更接近我們需要的。
3.2建立接口類文件
現(xiàn)在新建一個(gè)Java所需要的接口類,在工具窗口的app/src/main/java/com/vanxoak/cryptosdr文件夾上右鍵彈出菜單上新建一個(gè)“JavaClass”:

圖3.3:新建JavaClass
在新建串口中輸入類名稱“Rjgt102”,并使用默認(rèn)Class選項(xiàng):

圖3.4:NewRjgt102Class
新建完成后會(huì)生成一個(gè)Rjgt102.class的文件,在EditWindow中編輯類的接口信息,最終得到的文件如下:
packagecom.vanxoak.cryptosdr;
3.3通過類文件生成JNI接口
點(diǎn)擊左側(cè)ToolWindowBar的

圖標(biāo),或直接使用“Alt+F12”來打開終端窗口:

圖3.5:Terminal窗口
運(yùn)行下面的命令:
E:\RK3568_APP\cryptoSdr>cdapp\src\main
命令執(zhí)后,在cpp目錄下會(huì)生成一個(gè)com_vanxoak_cryptosdr_Rjgt102.h的頭文件,通過右鍵點(diǎn)擊Toolwindow中的cpp文件夾并”ReloadfromDisk”可以在Toolwindow中看到這一文件,打開文件可以看到下面的文件內(nèi)容:
/*DONOTEDITTHISFILE-itismachinegenerated*/
其中的內(nèi)容主要是我們將要實(shí)現(xiàn)的功能,我們在native-lib.cpp中實(shí)現(xiàn)上面的函數(shù),并刪除native-lib.cpp原先自動(dòng)生成的Java_com_vanxoak_cryptosdr_MainActivity_stringFromJNI函數(shù),并重新構(gòu)建整個(gè)工程,有于Rjgt102屬于加密芯片,源碼中含有密鑰信息,這里不暫時(shí)native-lib.cpp的源碼內(nèi)容,并且接下來我們將利用得到的動(dòng)態(tài)庫重新改造該項(xiàng)目使之僅使用生成的動(dòng)態(tài)庫而不再包含源碼。
在構(gòu)建完成后可以發(fā)現(xiàn)生成了多個(gè)libcryprosdr.so文件,以滿足多個(gè)架構(gòu)的需求:

圖3.6:多架構(gòu)下libcryprosdr.so文件
3.4MainActivity及布局文件的編寫
我們要實(shí)現(xiàn)的界面效果,如下圖所示。activity_main.xml里面定義了一個(gè)主體的LinearLayout,其中分布有2個(gè)TableLayout,然后在TableRow中分布TextView,Button,EditText以及Spinner控件,具體的編寫方法請參考本文檔配套資料提供的應(yīng)用程序源碼。

圖3.7:cryptoSdr顯示界面
MainActivity.java中要寫實(shí)現(xiàn)控件功能的邏輯代碼。在此文件中,將會(huì)對之前定義的Rjgt102接口進(jìn)行調(diào)用。
3.4.1Usid的顯示
我們希望打開應(yīng)用時(shí)就能顯示該Rjgt102芯片的Usid,這就需要我們在MainActivity的onCreate函數(shù)中就利用JNI來訪問Rjgt102芯片來獲取Usid信息,下面是獲取流程:
publicclassMainActivityextendsAppCompatActivity{
3.4.2 選擇所操作的page對象
讀取page或者更新page內(nèi)容都需要明確的page_id作為對象,page_id的選擇是通過Spinner控件進(jìn)行的,下面是page_id選擇的代碼示例:
publicclassMainActivityextendsAppCompatActivity{
實(shí)際上是對Spinner對象的ItemSelected事件進(jìn)行監(jiān)聽來獲取的pageId。
3.4.3讀取page內(nèi)容
讀取page內(nèi)容需要通過READPAGE按鈕觸發(fā):
publicclassMainActivityextendsAppCompatActivity{
3.4.4 更新page內(nèi)容
更新page內(nèi)容需要通過READPAGE按鈕觸發(fā):
publicclassMainActivityextendsAppCompatActivity{
4.轉(zhuǎn)為JniLibs項(xiàng)目
在上一章Native項(xiàng)目開發(fā)完成后,整個(gè)應(yīng)用功能已可使用,但由于nativec++代碼中含有敏感信息,需要保護(hù)而不公開native部分代碼,則需要將該部分代碼轉(zhuǎn)為應(yīng)用包含JniLibs的方式。
4.1新建jniLibs目錄
需要在app\src\main上右鍵單擊菜單中選擇New->Directory:

圖4.1:newDirecrory
將新建的目錄命名為jniLibs。
4.2拷貝libcryprosdr.so到j(luò)niLibs
現(xiàn)在將libcryprosdr.so文件拷貝進(jìn)來:

圖4.2:拷貝libcryprosdr.so文件到j(luò)niLibs
4.3刪除cpp目錄
現(xiàn)在需要?jiǎng)h除敏感nativec++源碼了,直接在src\app\src\main\cpp上右鍵單擊菜單中選擇Delete:

圖4.3:刪除cpp目錄
同樣方式可對中間過程文件存儲文件夾src\app\.cxx進(jìn)行刪除。
4.4刪除對cpp目錄的編譯引用
在刪除了cpp目錄后,還需要?jiǎng)h除項(xiàng)目中對cpp的編譯部分,這里需要修改app\build.gradle文件,使之不再進(jìn)行externalNativeBuild:

圖4.4:刪除對cpp的編譯
將上面內(nèi)容刪除后重新編譯工程即可。
-
APP
+關(guān)注
關(guān)注
33文章
1584瀏覽量
73615 -
加密芯片
+關(guān)注
關(guān)注
3文章
122瀏覽量
24112 -
安卓
+關(guān)注
關(guān)注
5文章
2140瀏覽量
58192 -
RK3568
+關(guān)注
關(guān)注
5文章
562瀏覽量
5922
發(fā)布評論請先 登錄
相關(guān)推薦
【藍(lán)牙4.1】安卓app安裝失敗
【云智易試用體驗(yàn)】安卓APP demo編譯與運(yùn)行
【Thunderboard Sense試用體驗(yàn)】安卓機(jī)安裝APP
聘尋安卓APP開發(fā)工程師
【有獎(jiǎng)體驗(yàn)】+安卓APP自動(dòng)生成源碼
安卓手機(jī)APP通過藍(lán)牙不能連接上stm32中的單片機(jī)中的藍(lán)牙模塊
***安卓版哪個(gè)好用
鴻蒙、iOS、安卓的開發(fā)者數(shù)量,APP數(shù)量大對比,差距有多大呢?
【吉方工控G-3288-02開發(fā)板試用體驗(yàn)】-RK3288安卓系統(tǒng)的WIFI聯(lián)網(wǎng)測試以及APK安裝器安卓APP安裝運(yùn)行測試體驗(yàn)
(遠(yuǎn)程控制)App inventor 編寫安卓app控制 ESP8266

Arduino/Android藍(lán)牙伺服電機(jī)控制安卓APP

云視角安卓APP更新通知

評論