Android NDK 初探,生成so文件以及調用so文件方法


 

因為最近業務上涉及安全的問題

然后有一些加密解密的方法和key的存儲問題

本來想存儲到手機里面,但是網上說一般敏感信息不要存儲到手機Sdcard上

而且我這個如果從網絡建立通信獲取的話,又太耗時,所以黑客論壇上就有人建議把加密解密的關鍵信息寫在so里,然后從so里面調用

要想破解so就涉及到匯編語言的,這個沒功力的話一般做不成的 O(∩_∩)O

在此感謝作者

原博文:http://www.cnblogs.com/yejiurui/p/3476565.html  作者:Andye

大體流程

   1:建立一個編譯jni用的builder

   2:寫java Client native 方法

   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的方法)

 

這樣就完成了 (*^__^*)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM