由於最近業務上涉及安全的問題html
而後有一些加密解密的方法和key的存儲問題java
原本想存儲到手機裏面,可是網上說通常敏感信息不要存儲到手機Sdcard上安全
並且我這個若是從網絡創建通訊獲取的話,又太耗時,因此黑客論壇上就有人建議把加密解密的關鍵信息寫在so裏,而後從so裏面調用網絡
要想破解so就涉及到彙編語言的,這個沒功力的話通常作不成的 O(∩_∩)O函數
在此感謝做者ui
原博文:http://www.cnblogs.com/yejiurui/p/3476565.html 做者:Andye編碼
大致流程加密
1:創建一個編譯jni用的builderspa
2:寫java Client native 方法3d
3:生成.h文件
4:編寫Android.mk和 .c文件
5:clean工程生成so文件,調用so內方法
下面步入正題(Eclipse平臺):
準備:在工程下創建一個jni文件夾
一:創建一個編譯jni用的Builder
在工程的properties裏new一個Builder
名字能夠隨便寫,而後選擇ndk中ndk_build.cmd文件的位置;第二個爲工程位置
Environment能夠不用設置其他按照圖示設置,以後點擊Specify Resources
選擇準備裏面創建的jni文件夾,至此第一步完成
二:寫java Client native 方法
新建一個JniClient類重要的是方法前綴! static public native !
注:這裏最好不要寫中文字符,不然會形成後面步驟編譯.h文件出錯,我這裏出錯了 (⊙o⊙)說是編碼GBK的不可映射字符
三:生成.h文件
用cmd命令定位到(命令 cd xxx)剛纔寫的JniClient.java的目錄 而後輸入「javac JniClient.java」 回車
成功了就能夠看到一個class文件
以後再將JniClinet.class拷貝到TestNdk\bin\classes\com\example\testndk目錄(這個是個人目錄結構不一樣工程結構將不一致,請注意!),將cmd命令定位到TestNdk\bin\classes目錄(注意是classes目錄!不是.class所在目錄),輸入」javah com_example_testndk_JniClient「後回車,在TestNdk\bin\classes目錄下就生成了C++頭文件com_example_testndk_JniClient.h
打開後.h文件 函數名聲明以下圖所示
典型的C\C++ 頭文件
四:編寫Android.mk和 .c文件
在jni文件夾下 建一個mk文件 後面.h和.c文件也要放進去
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestNdk LOCAL_SRC_FILES := com_example_testndk_JniClient.c include $(BUILD_SHARED_LIBRARY)
注意mk寫的時候 第4句爲.c文件的文件名
第三句爲工程名 ;
.c文件 方法的實現(這個基本是要本身寫的一個地方)
#include "com_example_testndk_JniClient.h" #include <stdlib.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_testndk_JniClient * Method: AddStr * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_testndk_JniClient_AddStr (JNIEnv *env, jclass arg, jstring instringA, jstring instringB) { jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !"); return str; } /* * Class: com_example_testndk_JniClient * Method: AddInt * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_example_testndk_JniClient_AddInt (JNIEnv *env, jclass arg, jint a, jint b) { return a + b; } #ifdef __cplusplus } #endif
這裏原做者是隻是返回了一個字符串並無對String字符串進行鏈接操做,哈哈 只是爲了演示so文件的大致流程嘛,具體實現本身能夠用C寫
五: clean工程生成so文件,調用so內方法
將.h .c 和Android.mk放在jni目錄下
當編輯com_ndk_test_JniClient.c並保存後,project下的—clean 一下工程,就能夠看到TestNkd工程下的obj/local/armeabi目錄下將自動生成libTestNdk.so庫。
番外正片:調用so中方法
例子:將調用so中的AddStr方法(其實調用JniClient的方法)
這樣就完成了 (*^__^*)