加密芯片是一種專門設計用于保護信息安全的硬件設備,它通過內置的加密算法對數據進行加密和解密,以防止敏感數據被竊取或篡改。如下圖HD-RK3568-IOT工控板,搭載ATSHA204A加密芯片,常用于有安全防護要求的工商業場景,下文將為大家介紹安卓APP開發中,如何使用此類加密芯片。
![3568開發板](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS6AZamXAATold44SUI659.png)
1.AndroidStudio工具配置
JNI(JavaNativeInterface,Java本地接口)是Java生態的特性,它擴展了Java虛擬機的能力,使得Java代碼可以與C/C++代碼進行交互。通過JNI接口,Java代碼可以調用C/C++代碼,C/C++代碼也可以調用Java代碼。雖然Java是平臺無關性語言,但運行Java語言的虛擬機是運行在具體平臺上的,所以Java虛擬機是平臺相關的。因此,對于調用平臺API的功能時,雖然在Java語言層是平臺無關的,但背后只能通過JNI技術在Native層分別調用不同平臺API。類似的,對于有操作硬件需求的程序,也只能通過C/C++實現對硬件的操作,再通過JNI調用。為了支持JNI的開發,在AndroidStudio工具中需要NDK(NativeDevelopmentKit)的支持。
![1.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS6AIDt2AAHkwDJglAU245.png)
圖1.1:添加NDK和CMake支持
點擊AndroisStudio的File->settings菜單,打上上面的settings頁面,首先找到AndroidSDK的設定位置,AndroidStudio版本不一樣時,其AndroidSDK所處的子項可能略有差異,然后點擊SDKTools頁簽,勾選上NDK和CMake的支持,然后安裝它們。
2.新建NativeC++工程
點擊File->Newproject,然后選中“NativeC++”工程模板,創建一個C++工程。最后點擊“Next”按鈕,如下圖所示:
![2.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS6AGpuZAAC1CV3hbl4767.png)
圖2.1:新建NativeC++項目
接著填寫工程的名字,包名,工程保存的位置以及語言,然后點擊“Next”按鈕,如下圖所示:
![3.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS6AWBrvAACvvrb7oI4608.png)
圖2.2:native項目設置
接著進行C++標準設定,這里可以根據熟悉的語言標準進行選擇,最后點擊“Finish”完成設定。
![4.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS6AELbXAABqwkPnnL4930.png)
圖2.3:C++Standard選擇
完成后,新建的項目窗口如下:
![5.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS6AVHGFAAE6i0IZZ0w004.png)
圖2.4:新建項目全貌
導航欄作用可以通過左側項目工具視圖體現,菜單欄也可以先隱藏而在需要時顯示,為使窗口空間的有效利用,通過View->Appearance將菜單欄隱藏,并將導航信息設定為在下方的StatusBar中顯示。
3.Native項目開發
3.1CPP開發
在窗口的左側邊沿是一條“ToolWindowBar”,用于選擇左側窗口“ToolWindow”的內容,在窗口的左上角有一個
![6.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-ADJglAAAB9dcYCDs443.png)
圖標,表示“ToolWindow”顯示為項目,點擊該圖標會有不同的視圖選擇,這里默認是“Android”視圖,現在點擊“Android”標簽,在下拉視圖選項中選擇“ProjectFile”視圖:
![7.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AYAsPAAAsvSMom7Q239.png)
圖3.1:項目視圖選擇
![8.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-ADk07AACR6vu2swo184.png)
圖3.2:ProjectFiles顯示
cryptosdr/app/src/main/AndroidManifest.xml是一個清單文件,在每個android應用項目必有的,它負責向Android構建工具,此文件是自動生成的。cryptosdr/app/src/main/java/com/vanxoak/cryptosdr/MainActivity.java是描述程序邏輯的java文件。cryptosdr/app/src/main/cpp下面有兩個文件,是我們要進行nativec++開發的地方:CMakeLists.txt:編譯腳本,用于告知如何編譯項目中的本地庫。native-lib.cpp:創建的本地庫示例代碼模板,后期代碼編寫主要在這個文件里面進行。現在分別詳細介紹一下這兩個文件,CMakeLists.txt解釋如下:
cmake_minimum_required(VERSION3.22.1)#設置Cmake的最低版本
navtive-lib.cpp文件,這個文件是本地庫的C++源碼。我們需要在這里定義本地庫對java(Android)層提供的接口。在java中調用我們定義和提供的接口,就能實現java操縱c++的能力,這里是自動生成的一個示例:
#include
我們需要對navtive-lib.cpp實現的內容進行修改,上面給了一個范例,我們也可以通過其它的方式讓這個文件更接近我們需要的。
3.2建立接口類文件
現在新建一個Java所需要的接口類,在工具窗口的app/src/main/java/com/vanxoak/cryptosdr文件夾上右鍵彈出菜單上新建一個“JavaClass”:
![11.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AASG_AAFXUceNnlI830.png)
圖3.3:新建JavaClass
在新建串口中輸入類名稱“Rjgt102”,并使用默認Class選項:
![12.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AGC7-AAAQryKBKVg338.png)
圖3.4:NewRjgt102Class
新建完成后會生成一個Rjgt102.class的文件,在EditWindow中編輯類的接口信息,最終得到的文件如下:
packagecom.vanxoak.cryptosdr;
3.3通過類文件生成JNI接口
點擊左側ToolWindowBar的
![](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-ALUmiAAAj-iyd4n4373.png)
圖標,或直接使用“Alt+F12”來打開終端窗口:
![15.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-AVz9uAABBlndXet8463.png)
圖3.5:Terminal窗口
運行下面的命令:
E:\RK3568_APP\cryptoSdr>cdapp\src\main
命令執后,在cpp目錄下會生成一個com_vanxoak_cryptosdr_Rjgt102.h的頭文件,通過右鍵點擊Toolwindow中的cpp文件夾并”ReloadfromDisk”可以在Toolwindow中看到這一文件,打開文件可以看到下面的文件內容:
/*DONOTEDITTHISFILE-itismachinegenerated*/
其中的內容主要是我們將要實現的功能,我們在native-lib.cpp中實現上面的函數,并刪除native-lib.cpp原先自動生成的Java_com_vanxoak_cryptosdr_MainActivity_stringFromJNI函數,并重新構建整個工程,有于Rjgt102屬于加密芯片,源碼中含有密鑰信息,這里不暫時native-lib.cpp的源碼內容,并且接下來我們將利用得到的動態庫重新改造該項目使之僅使用生成的動態庫而不再包含源碼。
在構建完成后可以發現生成了多個libcryprosdr.so文件,以滿足多個架構的需求:
![20.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AUJxzAABpxLeUAgo222.png)
圖3.6:多架構下libcryprosdr.so文件
3.4MainActivity及布局文件的編寫
我們要實現的界面效果,如下圖所示。activity_main.xml里面定義了一個主體的LinearLayout,其中分布有2個TableLayout,然后在TableRow中分布TextView,Button,EditText以及Spinner控件,具體的編寫方法請參考本文檔配套資料提供的應用程序源碼。
![21.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AXr_AAABi6XBXcrY693.png)
圖3.7:cryptoSdr顯示界面
MainActivity.java中要寫實現控件功能的邏輯代碼。在此文件中,將會對之前定義的Rjgt102接口進行調用。
3.4.1Usid的顯示
我們希望打開應用時就能顯示該Rjgt102芯片的Usid,這就需要我們在MainActivity的onCreate函數中就利用JNI來訪問Rjgt102芯片來獲取Usid信息,下面是獲取流程:
publicclassMainActivityextendsAppCompatActivity{
3.4.2 選擇所操作的page對象
讀取page或者更新page內容都需要明確的page_id作為對象,page_id的選擇是通過Spinner控件進行的,下面是page_id選擇的代碼示例:
publicclassMainActivityextendsAppCompatActivity{
實際上是對Spinner對象的ItemSelected事件進行監聽來獲取的pageId。
3.4.3讀取page內容
讀取page內容需要通過READPAGE按鈕觸發:
publicclassMainActivityextendsAppCompatActivity{
3.4.4 更新page內容
更新page內容需要通過READPAGE按鈕觸發:
publicclassMainActivityextendsAppCompatActivity{
4.轉為JniLibs項目
在上一章Native項目開發完成后,整個應用功能已可使用,但由于nativec++代碼中含有敏感信息,需要保護而不公開native部分代碼,則需要將該部分代碼轉為應用包含JniLibs的方式。
4.1新建jniLibs目錄
需要在app\src\main上右鍵單擊菜單中選擇New->Directory:
![26.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-ACTTTAADFu7DjWrY293.png)
圖4.1:newDirecrory
將新建的目錄命名為jniLibs。
4.2拷貝libcryprosdr.so到jniLibs
現在將libcryprosdr.so文件拷貝進來:
![27.png](https://file1.elecfans.com/web1/M00/F4/10/wKgZoWcjUS-ADF9jAACCgHT-vGw741.png)
圖4.2:拷貝libcryprosdr.so文件到jniLibs
4.3刪除cpp目錄
現在需要刪除敏感nativec++源碼了,直接在src\app\src\main\cpp上右鍵單擊菜單中選擇Delete:
![28.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AP7adAACBVrvOqjE714.png)
圖4.3:刪除cpp目錄
同樣方式可對中間過程文件存儲文件夾src\app\.cxx進行刪除。
4.4刪除對cpp目錄的編譯引用
在刪除了cpp目錄后,還需要刪除項目中對cpp的編譯部分,這里需要修改app\build.gradle文件,使之不再進行externalNativeBuild:
![29.png](https://file1.elecfans.com/web1/M00/F4/10/wKgaoWcjUS-AeenEAAFdhpo__uM665.png)
圖4.4:刪除對cpp的編譯
將上面內容刪除后重新編譯工程即可。
-
APP
+關注
關注
33文章
1577瀏覽量
72774 -
加密芯片
+關注
關注
3文章
117瀏覽量
23795 -
安卓
+關注
關注
5文章
2136瀏覽量
57596 -
RK3568
+關注
關注
4文章
525瀏覽量
5232
發布評論請先 登錄
相關推薦
【藍牙4.1】安卓app安裝失敗
【云智易試用體驗】安卓APP demo編譯與運行
【Thunderboard Sense試用體驗】安卓機安裝APP
【有獎體驗】+安卓APP自動生成源碼
安卓手機APP通過藍牙不能連接上stm32中的單片機中的藍牙模塊
***安卓版哪個好用
鴻蒙、iOS、安卓的開發者數量,APP數量大對比,差距有多大呢?
【吉方工控G-3288-02開發板試用體驗】-RK3288安卓系統的WIFI聯網測試以及APK安裝器安卓APP安裝運行測試體驗
(遠程控制)App inventor 編寫安卓app控制 ESP8266
![(遠程控制)<b class='flag-5'>App</b> inventor 編寫<b class='flag-5'>安</b><b class='flag-5'>卓</b><b class='flag-5'>app</b>控制 ESP8266](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Arduino/Android藍牙伺服電機控制安卓APP
![Arduino/Android藍牙伺服電機控制<b class='flag-5'>安</b><b class='flag-5'>卓</b><b class='flag-5'>APP</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論