項目實戰①―高仿知乎日報(0)-->NDK將私密數據隱藏起來
來源:程序員人生 發布時間:2014-12-13 09:10:08 閱讀次數:4467次

①安卓程序員真的很累
GAP ,NDK,說實話我基本算個了解的程度,如果你要準備加深安卓基礎的話,好吧,NDK是1道門坎,還有后面的 架構層,這尼瑪不花個1年你弄的定,GAP呢,如果你真要學的話,好吧,js css html5,還有web的框架,這尼瑪又是1年,你能學這些東西的條件,還是安卓基礎比較不錯的情況下,gap對快速開發是有著1定好處的,算了 不扯淡了,回到文章里面。
②開始學NDK加入到自己的項目里面
基于本人水平,暫時只能用NDK拿到隱藏1些APP的隱私數據,比如app的url連接,也算是1個小利用吧
1配置NDK環境
你知道我對NDK環境的配置,最擔心的是啥不,就是ndk必備的cywin PS:cywin是1款可以摹擬linux環境軟件
好了 到這里 大家可以移步到 android官網去下 NDK了。http://developer.android.com/
如果進不去呢,可以參考我這篇帖子
讓你能閱讀谷歌網站,仔細研究androidAPI======有獨立看英語谷歌文檔的能力
OK, 相信大家進了官網下NDK 還是會的
解壓下載的android-ndk32-r10-windows-x86_64.zip,將其放到你想要的目錄下。
注:R7之前的版本,必須要安裝Cygwin才能使用NDK。從R7開始,Windows版本的NDK提供了1個ndk-build.cmd腳本,可以直接利用這個腳本編譯。想要做到這1 點,只要為Eclipse Android工程添加1個Builder,就可以實現Eclipse的自動編譯NDK,這1點在后面的步驟會有介紹。
2,建立1個項目
然后單獨建立1個包 C 建1個類 API.java 注意這1句System.loadLibrary("api"); 它可以用來裝載庫文件,不論是JNI庫文件還是非JNI庫文件
api.java
package com.qf.teach.project.zhihudaily.c;
public class API {
static {
System.loadLibrary("api");
}
/**
* 主題
* @return
*/
public static native String getThemesUrl();
/**
* 歡迎圖片
* @return
*/
public static native String getStartImageUrl();
/**
* 本日熱聞
* @return
*/
public static native String getLatestUrl();
/**
* 歷史新聞<br />
* 返回的字符串需要使用String.format();方法格式化<br />
* 例如:String.format(API.getBefore(), "20141201");
* @return
*/
public static native String getBefore();
/**
* 主題列表<br />
* 返回的字符串需要使用String.format();方法格式化<br />
* 例如:String.format(API.getTheme(), "11");
* @return
*/
public static native String getTheme();
/**
* 詳情
* 返回的字符串需要使用String.format();方法格式化<br />
* 例如:String.format(API.getStory(), "4354228");
* @return
*/
public static native String getStory();
/**
* 詳情-評論
* 返回的字符串需要使用String.format();方法格式化<br />
* 例如:String.format(API.getStoryExtra(), "4354228");
* @return
*/
public static native String getStoryExtra();
}
//
String.format 將指定字符串中的每一個格式項替換為相應對象的值的文本等效項。
3,將NDK加入自己的項目了
1.生成java頭文件
接著就是重點了,在SRC目錄里建立1個jni的目錄,然后 找到api.java的目錄里 打開CMD 命令 輸入 javah api的類全名
這模樣就會得到1個頭文件 ,然后將它拷貝放入 jni 目錄
2.編寫C語言代碼
有人說生成的頭文件都會出錯,我只能說,請留言 我把詳細教程發給你,按著步驟來,ndk環境 3分鐘弄定
好吧 我先給大家看看我的頭文件吧
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xiaoxin_ZhiHuDateNews_c_API */
#ifndef _Included_com_xiaoxin_ZhiHuDateNews_c_API
#define _Included_com_xiaoxin_ZhiHuDateNews_c_API
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_xiaoxin_ZhiHuDateNews_c_API
* Method: getThemesUrl
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getThemesUrl
(JNIEnv *, jclass);
/*
* Class: com_xiaoxin_ZhiHuDateNews_c_API
* Method: getStartImageUrl
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getStartImageUrl
(JNIEnv *, jclass);
/*
* Class: com_xiaoxin_ZhiHuDateNews_c_API
* Method: getLatestUrl
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getLatestUrl
(JNIEnv *, jclass);
/*
* Class: com_xiaoxin_ZhiHuDateNews_c_API
* Method: getBefore
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getBefore
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

復制java頭文件的代碼
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getThemesUrl
(JNIEnv *, jclass);
記住 加 env thiz 也就變成這樣了
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getThemesUrl
(JNIEnv *env, jclass thiz){
好啦 下面就是C代碼了
# include "com_xiaoxin_ZhiHuDateNews_c_API.h"
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getThemesUrl
(JNIEnv *env, jclass thiz){
return (*env)->NewStringUTF(env, "http://news-at.zhihu.com/api/3/themes");
}
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getStartImageUrl
(JNIEnv *env, jclass thiz) {
return (*env)->NewStringUTF(env,
"http://news-at.zhihu.com/api/3/start-image/480*728");
}
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getLatestUrl
(JNIEnv *env, jclass thiz) {
return (*env)->NewStringUTF(env,
"http://news-at.zhihu.com/api/3/stories/latest");
}
JNIEXPORT jstring JNICALL Java_com_xiaoxin_ZhiHuDateNews_c_API_getBefore
(JNIEnv *env, jclass thiz){
return (*env)->NewStringUTF(env,
"http://news-at.zhihu.com/api/3/stories/before/%s");
}
類里面有1個 URL 也就是我要得到的URL在里面
然后在復制1個Android.mk 進去
代碼以下
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE⑵.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := api
LOCAL_SRC_FILES := com_xiaoxin_ZhiHuDateNews_c_API.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE 這個是 java代碼調用的類的名稱,
不是全類名~~~~~~~~?
LOCAL_SRC_FILES 是 jni下C代碼 是名稱不是全類名~~~~~~~~~~~~~~~
3.java和c的混合編譯
其實再次之前都還沒跟NDK扯上關系 到這里就開始有關系了
新建并配置1個Builder
點擊Project->Properties->Builders->New,新建立1個Builder。在彈出的對話框上面點擊Program,OK!如圖所示

在彈出的對話框【Edit Configuration】中,配置選項卡【Main】:
Location中需要填入nkd-build.cmd的路徑(NDK安裝目錄下)。
Working Diretcoty中需要填入TestNDK的工程根目錄。如圖所示:
注:不要漏了

配置選項卡【Refresh】,如圖所示:
勾選“Refresh resources upon completion”,
勾選“The entire workspace”,
勾選“Recuresively include sub-folders”。
配置選項卡【Build Options】,如圖7所示:
勾選“After a “Clean””,
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”。
點擊“Specify Resources…”勾選TestNDK工程的“jni“目錄 ,Finish!
然后你在按下 保存 eclipse就會自動幫我們編譯了 如果你看到下圖 說明你成功了
OK 下1節正式開始講 知乎日報的教程了~~~~~~~~~~~~~~~~~~```如果NDK配置環境出錯了,請給我留言 我發詳細教程給你
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈