项目实战①—高仿知乎日报(0)-->NDK将私密数据隐藏起来
2014-12-05 17:28
316 查看
①安卓程序员真的很累
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/
如果进不去呢,可以参考我这篇帖子
让你能浏览谷歌网站,仔细研究androidAPI======有独立看英语谷歌文档的能力
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配置环境出错了,请给我留言 我发详细教程给你
相关文章推荐
- 项目实战①—高仿知乎日报(2)—>使用pullrefesh+Slidingmenu+自定义组件写主布局
- 第四周(项目四扩展2)——数组做数据成员<读取文件>
- JSON解析之实战演练-->解析购物网站数据
- 第九周【项目1】在第8周项1的基础上(1)再定义一目运算符 -,-c相当于0-c(2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然
- (&lt;虚拟项目&gt;广告管理投放系统-2)Sql Server 2008 R2主数据管理系统的安装和配置
- 机器学习实战 -> 利用PCA&&SVD来简化数据
- <<项目架构那点儿事>>——hibernate泛型Dao,让持久层简洁起来 ...
- Android实战简易教程<三十五>(将二维码扫描和生成Demo引入项目实例)
- Android实战简易教程<二十五>(基于Baas的数据表查询下拉刷新和上拉加载实现!)
- OA项目实战学习(7)——初始化数据&权限配置显示
- 从接口拿到数据是<null>,项目就崩的问题
- Android实战简易教程<五十一>(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)
- 第四周(项目四扩展三)——数组做数据成员<数据存入文件>
- Android实战简易教程<十六>(LineChart实现数据趋势展示)
- SQL 函数----->数据类型转换函数 CAST()、CONVERT()
- MFC _Recordset->GetFields()->GetItem(const _variant_t &index)出现未找到项目
- Control Study -> Asp.net几个较复杂的显示数据控件(Repeater/DataList/DataGrid)用法 (示例代码下载)
- 脱《唐诗三百首1.2》壳(PEBundle 0.2 - 3.x -> Jeremy Collake)并提取MID数据
- 基于tcp/ip协议的Socket网络通讯 --> 简单的数据传送和库构造
- 初步搭建yui-ext(Ajax)的开发环境(第一部分:后台->前台数据交换)