這幾天在整這個東東,上網查了很多資料。
根據自己的實際情況整理一下,只實現調用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。