03.Eclipse下Ndk開發(fā)(以文件加密為例模擬一下開發(fā)過程)

(創(chuàng)建于2017/12/2)

1.編寫native方法

package com.example.ndk_file_encrpty;

public class Cryptor {
    
    static{
        System.loadLibrary("ndk_file_encrpty");
    }
    
    public native static void encrypt(String normal_path,String crypt_path);
    
    public native static void decrypt(String crypt_path,String decrypt_path);

}

2.進入eclipse項目src目錄下(cd 進入到src目錄下,使用命令生成頭文件 javah 包名+類型(如 com.renzhenming.utils.JniUtils)),如果是進入的bin目錄下使用此命令行的話,得到的頭文件只有一些聲明清寇,沒有生成相應(yīng)的jni方法

bin目錄下生成的是這樣的

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndk_file_encrpty_Cryptor */

#ifndef _Included_com_example_ndk_file_encrpty_Cryptor
#define _Included_com_example_ndk_file_encrpty_Cryptor
#ifdef __cplusplus
extern "C" {
#endif


#ifdef __cplusplus
}
#endif
#endif

src目錄下生成的才是我們需要的

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndk_file_encrpty_Cryptor */

#ifndef _Included_com_example_ndk_file_encrpty_Cryptor
#define _Included_com_example_ndk_file_encrpty_Cryptor
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_ndk_file_encrpty_Cryptor
 * Method:    encrypt
 * Signature: (Ljava/lang/String;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_ndk_1file_1encrpty_Cryptor_encrypt
  (JNIEnv *, jclass, jstring, jstring);

/*
 * Class:     com_example_ndk_file_encrpty_Cryptor
 * Method:    decrypt
 * Signature: (Ljava/lang/String;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_ndk_1file_1encrpty_Cryptor_decrypt
  (JNIEnv *, jclass, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

有一點需要注意的是:對于像這樣包名這樣命名的情況
8392687.png

因為存在下劃線,所以如果你直接按照平常的那種寫法去手寫,比如寫成這樣

JNIEXPORT void JNICALL Java_com_example_ndk_file_encrpty_Cryptor_encrypt

是錯誤的,正確的寫法是如上邊生成的

JNIEXPORT void JNICALL Java_com_example_ndk_1file_1encrpty_Cryptor_encrypt

在個別下劃線的前邊加了數(shù)字1,目前我也不知道為何廉侧,所以遇到這種包名页响,建議使用命令行生成

3.創(chuàng)建jni目錄(eclipse工程是直接在項目根目錄創(chuàng)建,將頭文件復(fù)制進去段誊,然后編寫c文件闰蚕,將對應(yīng)的方法名復(fù)制進去,引入需要的頭文件)

4.添加native支持(注意如果此時连舍,jni下尚且沒有c或者cpp文件add native support這個選項不會出現(xiàn)没陡,系統(tǒng)必須在檢測到j(luò)ni下的c/cpp文件之后才會有這個選項,所以索赏,先編寫出這個文件)(右鍵工程如圖盼玄,點擊add native support后彈出對話框(創(chuàng)建出頭文件之后),設(shè)置c文件名稱潜腻,o確定即可,然后會自動給你生成Android.mk文件埃儿,c文件,然后創(chuàng)建Application.mk文件)


![9129687.png](http://upload-images.jianshu.io/upload_images/7305851-69072500fdf1e425.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
9129687.png

5.確認(rèn)你的eclipse已經(jīng)配置了ndk融涣,注意童番,ndk的版本會有可能發(fā)生問題,這樣看你的eclipse最多能支持多大版本的ndk了
如果ndk版本過高威鹿,會導(dǎo)致你配置目錄之后仍然提示你有問題剃斧,如圖not a valid NDK directory,所以需要降低版本,我設(shè)置了r10之后可以了


9272984.png

6.添加ndk相關(guān)頭文件的支持(右鍵項目打開properties忽你,發(fā)現(xiàn)里邊由C/C++General選項幼东,這兩個選項是你添加了native surpport之后才有的)
9398312.png

在右邊的add選項,添加這三個目錄進去(一定要是你ndk中存在的目錄,不同版本有不同)

D:\application\java\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include

D:\application\java\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include-fixed

D:\application\java\android-ndk-r10e\platforms\android-18\arch-arm\usr\include

7.補充c文件的方法實現(xiàn)

#include <jni.h>
#include <com_example_ndk_file_encrpty_Cryptor.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>


char password[] = "renzhenming";

//加密
JNIEXPORT void JNICALL Java_com_example_ndk_1file_1encrpty_Cryptor_encrypt(
        JNIEnv *env, jclass jcls, jstring normal_path_jstr,jstring crypt_path_jstr) {
    //jstring -> char*
    const char* normal_path = (*env)->GetStringUTFChars(env,normal_path_jstr,JNI_FALSE);
    const char* crypt_path = (*env)->GetStringUTFChars(env,crypt_path_jstr,JNI_FALSE);

    //打開文件
    FILE *normal_fp = fopen(normal_path, "rb");
    FILE *crypt_fp = fopen(crypt_path, "wb");
    //一次讀取一個字符
    int ch;
    int i = 0; //循環(huán)使用密碼中的字母進行異或運算
    int pwd_len = strlen(password); //密碼的長度
    while ((ch = fgetc(normal_fp)) != EOF) { //End of File
        //寫入(異或運算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //關(guān)閉
    fclose(crypt_fp);
    fclose(normal_fp);
}

//解密
JNIEXPORT void JNICALL Java_com_example_ndk_1file_1encrpty_Cryptor_decrypt(
        JNIEnv * env, jclass jcls, jstring crypt_path_jstr, jstring decrypt_path_jstr) {
    const char* crypt_path = (*env)->GetStringUTFChars(env,crypt_path_jstr,JNI_FALSE);
    const char* decrypt_path = (*env)->GetStringUTFChars(env,decrypt_path_jstr,JNI_FALSE);

    //打開文件
    FILE *normal_fp = fopen(crypt_path, "rb");
    FILE *crypt_fp = fopen(decrypt_path, "wb");
    //一次讀取一個字符
    int ch;
    int i = 0; //循環(huán)使用密碼中的字母進行異或運算
    int pwd_len = strlen(password); //密碼的長度
    while ((ch = fgetc(normal_fp)) != EOF) { //End of File
        //寫入(異或運算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //關(guān)閉
    fclose(crypt_fp);
    fclose(normal_fp);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筋粗,一起剝皮案震驚了整個濱河市策橘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娜亿,老刑警劉巖丽已,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異买决,居然都是意外死亡沛婴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門督赤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘁灯,“玉大人,你說我怎么就攤上這事躲舌〕笮觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵没卸,是天一觀的道長羹奉。 經(jīng)常有香客問我,道長约计,這世上最難降的妖魔是什么诀拭? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮煤蚌,結(jié)果婚禮上耕挨,老公的妹妹穿的比我還像新娘。我一直安慰自己尉桩,他們只是感情好筒占,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜘犁,像睡著了一般赋铝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沽瘦,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天革骨,我揣著相機與錄音,去河邊找鬼析恋。 笑死良哲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的助隧。 我是一名探鬼主播筑凫,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滑沧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巍实?” 一聲冷哼從身側(cè)響起滓技,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚潦,沒想到半個月后令漂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡丸边,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年叠必,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹窖。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纬朝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骄呼,到底是詐尸還是另有隱情共苛,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布蜓萄,位于F島的核電站隅茎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绕德。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一摊阀、第九天 我趴在偏房一處隱蔽的房頂上張望耻蛇。 院中可真熱鬧,春花似錦胞此、人聲如沸臣咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺蛇。三九已至,卻和暖如春酣胀,著一層夾襖步出監(jiān)牢的瞬間刁赦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工闻镶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甚脉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓铆农,卻偏偏與公主長得像牺氨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容