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

cocos2dx通过ndk编译c++库的更多相关文章

  1. ndk 编译 boost 库,支持serialization

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...

  2. ndk编译protobuf库

    ndk_r9编译通过,里面带了自动生成代码的脚本(tool/createPBFile.bat). 下载地址

  3. 用NDK编译lua库

    Android.mk是这样的 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := lua LOCAL_SRC_FILE ...

  4. 使用javah生成jni 头文件和使用ndk编译so库

    1.jni 首先clean Project,在makeProject生成对应的class文件 然后点出命名框,输入命令: cd app/build/intermediates/classes/debu ...

  5. protobuf使用NDK编译Android的静态库(工作记录)

    1.protobuf 编译过程 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功 1.1 把protobuf 压缩包解压到protobuf文件夹下 ...

  6. [转]NDK编译库运行时报dlopen failed: cannot locate symbol "__exidx_end" 解决办法

    原文链接:http://blog.csdn.net/acm2008/article/details/41040015 当用NDK编译的库在运行加载时报如下错: dlopen("/data/d ...

  7. NDK编译库执行时报dlopen failed: cannot locate symbol "__exidx_end" 解决的方法

    当用NDK编译的库在执行载入时报例如以下错: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen faile ...

  8. Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

    利用Android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM.编译的时候始终报以下错误: XXX: ...

  9. 使用android ndk编译x86 so在linux下使用的问题

    一直以为android ndk编译x86 so库可以在linxu下运行,结果我试了几次都行不通.后来想了一下,android ndk编译的库应该只能在android设备或模拟器上运行才有效,后来改用 ...

随机推荐

  1. 关于c语言中的字符串问题

    对字符数组,字符指针,字符串常量 在csdn上看到一篇关于这方面的帖子,有所收获. JohnTitor的专栏 1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写   & ...

  2. JAVA之动态编译

    通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以 ...

  3. react-native-syan-image-picker的使用

    传送门 第一种方式:link 第一步:安装 1.  npm install react-native-syan-image-picker --save 2.  react-native link re ...

  4. Centos 自动更新git

    首先,要先配置好自己的Git,然后在某一处进行脚本的编写. 比如项目目录为:/home/project,那参考如下来进行 vim /home/project/automatic_git.sh #/bi ...

  5. 极客学院年VIP卡原价260的F码,200出售

    F码是中国最大的IT职业在线教育平台——极客学院推出的VIP时间兑换码,凭此可在极客学院官网兑换年VIP,畅享平台上所有IT技术课程. 购买请点击 http://www.bejson.com/othe ...

  6. ES6新特性使用小结(四)

    十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...

  7. [LOJ 2039] 「SHOI2015」激光发生器

    [LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...

  8. QDU-GZS与素数大法(素数筛法)

    Description 自从GZS成为G神之后,追随者不计其数,更是有了大名鼎鼎的拜神论: "吾尝终日编程也,不如须臾之拜拜G神也:吾尝打字刷题也,不如一日三拜G神也: 拜拜G神,程序非长也 ...

  9. [NWPU2016][寒假作业][正常版第三组]R&&HDU1240

    题意是有个三维的地图,从起点到终点的最短路径.用bfs做,不过这个题坑的地方在于,开三维数组你要搞清楚纬度的关系.a[i][j][h] i是层,j是行,h是列.然后坐标呢,又是列,行,层,所以如果要用 ...

  10. qt QMessageBox 中文乱码的问题

    QMessageBox::information(this,"Warn", "请插入U盘"); ==================> QMessageB ...