ndk编译c++库,然后通过jni调用实现重要代码封装,是安卓应用中最常用的技术,一方面可以将重要的代码实现隐藏,防止泄漏,也可以提高打包速度。
ndk里面的sample文件夹中有很多实用的例子,其中hello-jni有一个编译c++的例子。
首先,创建一个jn文件夹,文件夹内放置Android.mk和Application.mk两个文件,Android.mk文件主要是
写入编译的c++代码,打包的库名,打包的库类型(静态库or动态库),引用的模块等等。Application.mk
是主要表示打包的库所属的指令类型,使用的ndk版本,使用gnu版本,还有引用其他库 等等。
将要编译的c++代码拷贝到jni文件夹下,以下是Android.mk和Application.mk两个文件的例子。
Application.mk:
#只导出arm版本的库
APP_ABI := armeabi
#使用ndk4.8的库版本
NDK_TOOLCHAIN_VERSION := 4.8
#使用stl的库类型
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CPP_FEATURES += exceptions
#这里是导出模块的名字
LOCAL_MODULE := mirage
#这里是导出模块的文件名
LOCAL_MODULE_FILENAME := libmirage
#要编译jni目录下的代码文件夹
LOCAL_C_INCLUDES := $(LOCAL_PATH)/lua
$(LOCAL_PATH)/include
#traverse all the directory and subdirectory
define walk
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef
#traverse Classes Directory
#过滤文件,只编译c++和c文件
ALL_FILES := $(call walk, $(LOCAL_PATH)/src)
CPP_FILE_LIST := $(filter %.cpp, $(ALL_FILES))
CPP_FILE_LIST += $(filter %.c, $(ALL_FILES))
CPP_FILE_LIST += $(filter %.cc, $(ALL_FILES))
LOCAL_SRC_FILES := $(CPP_FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include
LOCAL_CFLAGS += -Wno-psabi
LOCAL_EXPORT_CFLAGS += -Wno-psabi
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_lua_static
#指明导出的库是.so静态库
include $(BUILD_STATIC_LIBRARY)
#这里是导入要引用的外部c代码的路径
$(call import-add-path, /Users/HemJohn/Desktop/onePiece_client/frameworks/cocos2d-x)
#这里是导入要引用的外部库模块
$(call import-module,scripting/lua-bindings/proj.android)
有了上面的步骤后,
在控制台,cd到jni文件夹的目录
执行ndk文件夹里面的ndk-build执行文件(windows系统执行ndk-build.cmd),也可以在环境变量中,添加
ndk的目录.
以下是执行结果:
在jni同一目录下,会产生一个obj文件夹,里面存放编译好的.a库
转载请注明出处,from博客园HemJohn