逆向技能+2 JNI介绍
http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html
关于NDK的介绍如上:
JNI
what 什么是JNI?
*java native interface native 本地语言 系统是由什么开发的 linux是由c开发的 那么这种语言对于这个系统来说就是本地语言
*native 本地语言 本地代码
*作用是java 和c/c++相互调用
jni 实质是一个接口 java的方法调用c的函数
jni 相当于是 把c/c++函数翻译成java
也可以把java翻译成c/c++代码
why 为什么用jni?
*java的优势 一处编译 到处运行 java虚拟机跨平台
*java想直接访问系统底层的驱动
*android里的java代码都是跑在虚拟机里面的
*不能直接控制驱动 jni扩展java代码的能力 驱动大部分是由c编写的
*特斯拉车载智能系统就是用的linux --按下按钮登就开了。
*c编译生成的就是机器码 java需要虚拟机翻译(解释型语言--效
率低) 大型的3d游戏或者是音视频解码就不能用java
*android系统是16ms刷新一次屏幕 通过JNI 放到C或者C++来实现
*抗反编译的能力加强 加密的登录逻辑一定要放在c里面如密文和算法 eg拿到上传包+源码加密逻辑 即可破解
开发者平时编写android时。framwork层连接函数库层也是用的JNI(Native Developer Kit)
只是google已经提开发者封装好了,提供给开发者一个API。所以我们也用JNI,只是没有感觉到而已。
how 怎么用JNI
会用 java
c/c++ 能看懂,会调用。
interface JNI的开发流程
交叉编译
—在一个平台上编译出另一个平台可以运行的本地代码
cpu平台
arm架构 x86(Atom) mips
不同架构支持的指令集是有差别的
精简指令和复杂指令集
操作系统平台
windows linux Mac os unix
模拟另一个平台的特点进行编译
jni开发工具
NDk native develop kit 本地开发工具
NDK的目录
> 引用块内容
结构
docs 帮助文档
platforms 根据不同的android版本分了不同的文件夹
--include jni开发常用的头文件
--lib google官方提供 jni开发中可能用到的库
build\tools .sh文件linux下批处理文件 系统自动调用 开始交叉编译的过程
samples 样例
sources ndk相关源码
ndk-build.cmd 开始交叉编译的命令
CDT 高亮显示c关键字 c代码提示
jni helloworld
新建一个android工程JNI_01
先写JAVA代码 用native关键字 声明本地方法 本地方法不用实现 在c中实现
看源码
JNIEnv 是一个别名 上面是结构体的指针
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif
jint (*GetVersion)(JNIEnv *);
这个是函数体的指针
通过JNIEnv调用
再写玩c之后用ndk-build构建头文件
cd /d 项目所在的目录即可构建头文件
编辑后报错说缺少android.mk文件
补充上mk文件makefile文件
找到jni目录的路径
LOCAL_PATH := $(call my-dir)
清除上一次编译的local_Path不会被清除
include $(CLEAR_VARS)
编译生成的文件的名字
LOCAL_MODULE := hello
本地资源文件,指定.c的文件 hello.c hello2.c
LOCAL_SRC_FILES := hello.c
指定编译动态链接库.so(linux) .dll(windows)
include $(BUILD_SHARED_LIBRARY)
在cd到项目目录下 用ndk-build再编译
jni开发常见错误
natvie method not found
1.本地函数名字 不符合命名规则
方法名或者包名有下滑线的需要进行+1操作
hello____1111world11___JNi();
用javah生成头文件
如果是jdk1.7以上的就到项目的src目录下看
如果是jdk1.6以下的就到bin/classes在哪运行头文件就到哪去找
2. System.loadlibrary("hello");忘记写了
loader ....findlibrary returned null
只截取lib之后的modle libhello
1.System.loadlibrary("libhello")
2.cpu平台不支持(比如 把你个只支持arm处理器的.so文件部署到x86架构下)
这时候就需要解决需要生成x86的so文件---途径如下:
建立一个Application.mk 导入APP_ABI :x86 armeabi
也可解决mindsdkversion的问题
APP_PLATFORM :=android-14 #解决警告
再用ndk-build重新编译一次
jni开发简便流程
先写java代码 用native关键字 声明本地方法 本地方法不需要实现
添加本地支持 选择 adroid toos -》add native support
有的需要 点击window -》preferencs -》android 》ndk
会自动生成jni目录
再用javah生成头文件