zoukankan      html  css  js  c++  java
  • cocos2dx通过ndk编译c++库

    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

  • 相关阅读:
    HTML5(3) 拖放(Drag 和 Drop)
    HTML5(2) 画布Canvas
    HTML5(1) 介绍
    C#(99):System.IO.Path文件路径类
    SQL Server(00):逻辑函数
    SQL Server(00):删除表中的重复数据
    DevExpress03、XtraGrid(1)基本应用
    DevExpress11、TreeList
    DevExpress10、RichEditControl
    XtraEditors五、SpinEdit、TimeEdit
  • 原文地址:https://www.cnblogs.com/HemJohn/p/5794101.html
Copyright © 2011-2022 走看看