近来有需求在Android下开发程序,由于性能的需求,不能使用java语言来实现效率要求较高的代码;
下载了最新的r7 NDK,解压到某一Linux目录
1.设置环境变量,下面语句加入到.bash_profile中:
export NDK_HOME=<path to android ndk>
export PATH=$NDK_HOME:$PATH
之后就可以在任意工程目录里运行ndk-build来编译自己的程序了
2.Android NDK r7在默认的工程目录结构上和之前的NDK相比有一定的改变(本人没有使用过其他版本,但是单依据网上搜索到的文章来实现已经行不通了)
<Project dir>
-Application.mk//如果为应用程序,一般会有这个文件,静态编译时该文件在jni目录下
-default.properties//可以确定使用的API集合
-<jni> //源文件目录
-Android.mk//类似于makefile文件
-*.h *.c *.cpp//源文件
- Application.mk格式
一般只有这句:
如果如果ndk为r7版本,并且为静态库编译,则应该将该文件放置到jni目录下,并且使用这句APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := lib<name> //name为你的库名称
- default.properties格式,工程一般应该有这个文件:
target=android-8 //使用的目标机器API版本
- Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := <输出文件名字> LOCAL_SRC_FILES := ... //列出你所有的.c .cpp源文件 LOCAL_CFLAGS := -O2 -g -DANDROID_ARM //加入你希望的编译选项 LOCAL_LDLIBS += -lc //这个是链接选项 include $(BUILD_SHARED_LIBRARY)//这里可以设置生成的目标文件类型(BUILD_SHARED_LIBRARY是动态加载库,BUILD_STATIC_LIBRARY是静态库,BUILD_EXECUTABLE则可直接作为应用程序编译)
3.在工程目录下运行ndk-build,也可以在任意目录下运行ndk-build -C <Project dir>来编译,编译结果一般在<Project dir>/libs/armeabi/下
下面是一个编译libpcap的例子:
1.从网上搜索的android官方发布的libpcap git源地址已经改变了,现在其域名为:
https://android.googlesource.com/
2.下载libpcap的git源,运行:git clone https://android.googlesource.com/platform/external/libpcap.git
3.将libpcap下所有文件移入libpcap工程目录的jni目录下面
4.Android.mk内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
bpf_dump.c \
bpf/net/bpf_filter.c \
bpf_image.c \
etherent.c \
fad-gifc.c \
gencode.c \
grammar.c \
inet.c \
nametoaddr.c \
optimize.c \
pcap.c \
pcap-linux.c \
savefile.c \
scanner.c \
version.c
LOCAL_CFLAGS := -O2 -g
LOCAL_CFLAGS += -DHAVE_CONFIG_H -D_U_="__attribute__((unused))" -Dlinux -D__GLIBC__ -D_GNU_SOURCE
LOCAL_MODULE := libpcap
include $(BUILD_STATIC_LIBRARY)
5.注意为静态编译,jni目录下还应该有一个Application.mk文件
APP_MODULES := libpcap
6.cd到工程目录(也就是jni的上一级)
运行ndk-build
7.不出问题的话,将能在<工程目录>/libs/armeabi/下找到libpcap.a
8.之后的文件就可以直接使用libpcap的头文件并链接这个库来编译了