项目实战①—高仿知乎日报(0)-->NDK将私密数据隐藏起来

①安卓程序员真的很累 

GAP ,NDK,说实话我基本算个了解的程度,如果你要准备加深安卓基础的话,好吧,NDK是一道门槛,还有后面的 架构层,这尼玛不花个一年你搞的定,GAP呢,如果你真要学的话,好吧,js css html5,还有web的框架,这尼玛又是一年,你能学这些东西的前提,还是安卓基础比较不错的情况下,gap对于快速开发是有着一定好处的,算了 不扯淡了,回到文章里面。


②开始学NDK加入到自己的项目里面

基于本人水平,暂时只能用NDK拿到隐藏一些APP的隐私数据,比如app的url连接,也算是一个小应用吧

一配置NDK环境 

你知道我对于NDK环境的配置,最担心的是啥不,就是ndk必备的cywin  PS:cywin是一款可以模拟linux环境软件
好了 到这里 大家可以移步到 android官网去下 NDK了。 http://developer.android.com/

如果进不去呢,可以参考我这篇帖子
  
OK,  相信大家进了官网下NDK 还是会的 

解压下载的android-ndk32-r10-windows-x86_64.zip,将其放到你想要的目录下。

注:R7之前的版本,必须要安装Cygwin才能使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。想要做到这一 点,只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK,这一点在后面的步骤会有介绍。

二,建立一个项目 

然后单独建立一个包 C 建一个类 API.java   注意这一句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 将指定字符串中的每个格式项替换为相应对象的值的文本等效项。

三,将NDK加入自己的项目了

1.生成java头文件
接着就是重点了,在SRC目录里建立一个jni的目录,然后 找到api.java的目录里 打开CMD 命令 输入 javah api的类全名 
这样子就会得到一个头文件 ,然后将它拷贝放入 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");
}

类里面有一个 URL 也就是我要得到的URL在里面  
然后在复制一个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-2.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扯上关系 到这里就开始有关系了


新建并配置一个Builder

点击Project->Properties->Builders->New,新建立一个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】,如图七所示:

勾选“After a Clean””,

勾选“During manual builds”,

勾选“During auto builds,

勾选“Specify working set of relevant resources”。

点击“Specify Resources…”勾选TestNDK工程的“jni“目录 ,Finish



然后你在按下 保存 eclipse就会自动帮我们编译了  如果你看到下图 说明你成功了


OK 下一节正式开始讲 知乎日报的教程了~~~~~~~~~~~~~~~~~~```如果NDK配置环境出错了,请给我留言 我发详细教程给你



评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值