Android調用C++程序

這幾天在整這個東東,上網查了很多資料。

根據自己的實際情況整理一下,只實現調用C++函數。

需求:調用C++編寫的根據傳入的隨機數組,生成加密後的數組。

 

1.下載NDK,然後解壓,將路徑添加到環境變量,重啓電腦。

  R 7以上版本不需要安裝cygwin,省事好多。

  不配置環境變量也行,就是運行nkd命令時要指定路徑

 

 

2.首先要聲明在Android調用的C++函數;

  public native void MD5CheckPrinter(byte[] MD5Rand,byte[] MD5Return);native是修飾符必須的

  System.loadLibrary:加載最後生成的.so文件

 

3.打開命令管理器,進入調用C++函數文件所在的包的父路徑(我的是在項目內的bin文件夾下,但我生成.h文件不成功)

  然後調用javah命令:javah [-classpath 要生成的文件所在包的父路徑] -jni 完整包名.類名

  由於當前目錄就是包所以父目錄,所以直接-jni參數就可以了。

 

  生成的中間會提示找不到包和類,但是沒關係,.h文件生成,有包含函數聲明就可以:

JNIEXPORT void JNICALL Java_PRTAndroidSDK_PRTAndroidPrint_MD5CheckPrinter

  (JNIEnv *, jobject, jbyteArray, jbyteArray);

爲聲明加上參數名

JNIEXPORT void JNICALL Java_PRTAndroidSDK_PRTAndroidPrint_MD5CheckPrinter

  (JNIEnv *_pEnv, jobject _obj, jbyteArray _jbyteArrRand, jbyteArray _jbyteArrReturn);

 

4.在項目下面新建jni文件夾,將PRTAndroidSDK_PRTAndroidPrint.h文件複製進去。

 

5.新建PRTAndroidSDK_PRTAndroidPrint.cpp文件,裏面實現C++內容。

  文件頭包含PRTAndroidSDK_PRTAndroidPrint.h文件,cpp文件裏面函數實現必須跟h文件聲明一樣。

  我是在VS裏面修改原C++文件的,這樣有錯誤時會提示。由於本人是C++菜鳥,在最開始編譯時將被調用函數放在了文件尾,所以提示找不到函數。

  裏面的很多數據類型都需要轉換

 

 

6.新建.mk文件:編譯成so文件所需的配置文件,下面幾行是必須的,最簡單的幾個設置

網上有關於.mk文件的更詳細的說明,有興趣的可以去找找

 

 

7.在項目目錄下運行nkd-build命令,會在bin/armeabi目錄下生成.mk文件裏面設置的文件名,會自動在最面前加lib,使用時不能加這三個字符。

由於我界面和部分功能所以目錄分開,所以javah和ndk-build兩個命令使用的目錄不同。

 

8.至此,就可以調用C++實現的功能了,可以將軟件的關鍵部分進行包裝。

9.再寫下其它兩個加密方法(轉載):

   關鍵數據可放在服務器,使用時從服務器下載下來使用。

   部分代碼可放在服務器,使用服務器下載下來解密後用eval命令運行。此方法需要定期更新加密算法,同時定期更新APP。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章