加密芯片是一種專門設(shè)計(jì)用于保護(hù)信息安全的硬件設(shè)備,它通過內(nèi)置的加密算法對(duì)數(shù)據(jù)進(jìn)行加密和解密,以防止敏感數(shù)據(jù)被竊取或篡改。如下圖HD-RK3568-IOT工控板,搭載ATSHA204A加密芯片,常用于有安全防護(hù)要求的工商業(yè)場(chǎng)景,下文將為大家介紹安卓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是平臺(tái)無(wú)關(guān)性語(yǔ)言,但運(yùn)行Java語(yǔ)言的虛擬機(jī)是運(yùn)行在具體平臺(tái)上的,所以Java虛擬機(jī)是平臺(tái)相關(guān)的。因此,對(duì)于調(diào)用平臺(tái)API的功能時(shí),雖然在Java語(yǔ)言層是平臺(tái)無(wú)關(guān)的,但背后只能通過JNI技術(shù)在Native層分別調(diào)用不同平臺(tái)API。類似的,對(duì)于有操作硬件需求的程序,也只能通過C/C++實(shí)現(xiàn)對(duì)硬件的操作,再通過JNI調(diào)用。為了支持JNI的開發(fā),在AndroidStudio工具中需要NDK(NativeDevelopmentKit)的支持。
圖1.1:添加NDK和CMake支持
點(diǎn)擊AndroisStudio的File->settings菜單,打上上面的settings頁(yè)面,首先找到AndroidSDK的設(shè)定位置,AndroidStudio版本不一樣時(shí),其AndroidSDK所處的子項(xiàng)可能略有差異,然后點(diǎn)擊SDKTools頁(yè)簽,勾選上NDK和CMake的支持,然后安裝它們。
2.新建NativeC++工程
點(diǎn)擊File->Newproject,然后選中“NativeC++”工程模板,創(chuàng)建一個(gè)C++工程。最后點(diǎn)擊“Next”按鈕,如下圖所示:
圖2.1:新建NativeC++項(xiàng)目
接著填寫工程的名字,包名,工程保存的位置以及語(yǔ)言,然后點(diǎn)擊“Next”按鈕,如下圖所示:
圖2.2:native項(xiàng)目設(shè)置
接著進(jìn)行C++標(biāo)準(zhǔn)設(shè)定,這里可以根據(jù)熟悉的語(yǔ)言標(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)目中的本地庫(kù)。native-lib.cpp:創(chuàng)建的本地庫(kù)示例代碼模板,后期代碼編寫主要在這個(gè)文件里面進(jìn)行?,F(xiàn)在分別詳細(xì)介紹一下這兩個(gè)文件,CMakeLists.txt解釋如下:
cmake_minimum_required(VERSION3.22.1)#設(shè)置Cmake的最低版本
navtive-lib.cpp文件,這個(gè)文件是本地庫(kù)的C++源碼。我們需要在這里定義本地庫(kù)對(duì)java(Android)層提供的接口。在java中調(diào)用我們定義和提供的接口,就能實(shí)現(xiàn)java操縱c++的能力,這里是自動(dòng)生成的一個(gè)示例:
#include
我們需要對(duì)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”來(lái)打開終端窗口:
圖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)的功能,我們?cè)趎ative-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)容,并且接下來(lái)我們將利用得到的動(dòng)態(tài)庫(kù)重新改造該項(xiàng)目使之僅使用生成的動(dòng)態(tài)庫(kù)而不再包含源碼。
在構(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控件,具體的編寫方法請(qǐng)參考本文檔配套資料提供的應(yīng)用程序源碼。
圖3.7:cryptoSdr顯示界面
MainActivity.java中要寫實(shí)現(xiàn)控件功能的邏輯代碼。在此文件中,將會(huì)對(duì)之前定義的Rjgt102接口進(jìn)行調(diào)用。
3.4.1Usid的顯示
我們希望打開應(yīng)用時(shí)就能顯示該Rjgt102芯片的Usid,這就需要我們?cè)贛ainActivity的onCreate函數(shù)中就利用JNI來(lái)訪問Rjgt102芯片來(lái)獲取Usid信息,下面是獲取流程:
publicclassMainActivityextendsAppCompatActivity{
3.4.2 選擇所操作的page對(duì)象
讀取page或者更新page內(nèi)容都需要明確的page_id作為對(duì)象,page_id的選擇是通過Spinner控件進(jìn)行的,下面是page_id選擇的代碼示例:
publicclassMainActivityextendsAppCompatActivity{
實(shí)際上是對(duì)Spinner對(duì)象的ItemSelected事件進(jìn)行監(jiān)聽來(lái)獲取的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)來(lái):
圖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目錄
同樣方式可對(duì)中間過程文件存儲(chǔ)文件夾src\app\.cxx進(jìn)行刪除。
4.4刪除對(duì)cpp目錄的編譯引用
在刪除了cpp目錄后,還需要?jiǎng)h除項(xiàng)目中對(duì)cpp的編譯部分,這里需要修改app\build.gradle文件,使之不再進(jìn)行externalNativeBuild:
圖4.4:刪除對(duì)cpp的編譯
將上面內(nèi)容刪除后重新編譯工程即可。
-
APP
+關(guān)注
關(guān)注
33文章
1565瀏覽量
72329 -
加密芯片
+關(guān)注
關(guān)注
2文章
110瀏覽量
23593 -
安卓
+關(guān)注
關(guān)注
5文章
2116瀏覽量
56955 -
RK3568
+關(guān)注
關(guān)注
4文章
487瀏覽量
4875
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論