1. 介绍
Ndk是为了让开发人员,开发更好的程序而提供的,主要是通过编写c c++ 程序
来实现的,而google也提供了jni接口,从而实现在c/c++程序中和java代码进行通讯
以及调用,等.http://blog.youkuaiyun.com/li740207611/article/details/50877189 有ida ndk下载安装提示可以看看
2. 编译
2.1 gcc编译
gcc 编译因为需要链接文件,所以写一个makeFile是最好的选择
hello.c 源码 :
#include <stdio.h>
int main(int argc, char* argv[]){
printf("Hello ARM!\n");
return 0;
}
makefile 文件 :
#这里填写你自己的ndk路径 window 也一样 下面的把相应的路径换成自己的就可以了
NDK_ROOT=/home/android/tools/android/android-ndk-r8
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.4.3/include-fixed
PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-14/arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/include
PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib
MODULE_NAME=hello
RM=rm -rf
FLAGS=-I$(TOOLCHAINS_INCLUDE) \
-I$(PLATFORM_INCLUDE) \
-L$(PLATFORM_LIB) \
-nostdlib \
-lgcc \
-Bdynamic \
-lc
OBJS=$(MODULE_NAME).o \
$(PLATFORM_LIB)/crtbegin_dynamic.o \ //start 开始动态调用属于原生程序的入口函数 相当于普通c文件的main 函数
$(PLATFORM_LIB)/crtend_android.o //end
all:
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
$(RM) *.o
install:
adb push $(MODULE_NAME) /data/local/
adb shell chmod 755 /data/local/$(MODULE_NAME)
编译
make -f makefile #编译成功生成hello可执行文件
make -f makefile install //这一步一般都会出现 permission 不够的问题,除非你的手机rooted了 并且做了相应的配置不然是不行了
当然你只要知道怎么 生成的过程就可以了,google 建议使用下面的ndk自带的编译,
2.2 ndk编译
需要新建一个android 程序,然后在根目录下面新建 jni文件夹 把hello.c 拷贝进去
然后新建一个Android.mk文件
LOCAL_PATH := $(call my-dir) # my-dir 是一个源码目录的宏定义,这里只要声明就可以了
include $(CLEAR_VARS) #清除掉一些已经定义的宏定义,比如我只是一个子程序 可能和主程序定义的宏有冲突,所以直接清除
LOCAL_ARM_MODE := arm #指定生成32位的arm指令
LOCAL_MODULE := hello #编译后文件的名字
LOCAL_SRC_FILES := hello.c #源文件的名字列表 ,因为我们只有一个所以就写一个
include $(BUILD_EXECUTABLE) #BUILD_EXECUTABLE 表示生成可执行文件,
BUILD_SHARE_LIBRARY 动态库 BUILD_SHARE_LIBRARY 静态库
编译
上面俩步通过之后,如果你的ndk已经设置有环境变量,就直接执行ndk-build
如果没有就去根目录下面的 然后执行 ndk-build
2.3 通过eclipse android 等编译器直接编译
这个我只是知道,但是自己没有尝试,可以自己尝试一下
3. 反编译
1. ida
就直接把第二步生成的可执行文件,拖到ida就可以,
去第一步下载安装
2. ndk
ndk提供的有一个工具,在目录android-ndk/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/
下面有一个 arm-linux-androideabi-objdump 可执行文件
arm-linux-androideabi-objdump -S /yourpath/hello
就会直接在控制台输出反编译的结果.