Cocos2d-x中使用第三方so库

Cocos2d-x中使用第三方so库,第1张

概述项目中如果使用到第三方的SDK,大多数是以.so动态共享库的文件打包给我们使用,如何使用他们,见下面分析。 1、获得库文件 假如我们得到的库文件是libxxx.so(注:关于.so文件的命名方式,可百度)。在Jni目录下新建prebuilt文件夹,把获得的库文件 拷贝到该文件夹下。 2、使用库文件 库文件的使用需要修改Android.mk,在mk文件中加入以下代码: include $(CLEAR

项目中如果使用到第三方的SDK,大多数是以.so动态共享库的文件打包给我们使用,如何使用他们,见下面分析。

1、获得库文件
假如我们得到的库文件是libxxx.so(注:关于.so文件的命名方式,可百度)。在Jni目录下新建prebuilt文件夹,把获得的库文件
拷贝到该文件夹下。 2、使用库文件
库文件的使用需要修改AndroID.mk,在mk文件中加入以下代码:
include $(CLEAR_VARS)  LOCAL_MODulE := xxx  LOCAL_SRC_fileS := prebuilt/libxxx.so  include $(PREBUILT_SHARED_liBRARY)    LOCAL_SHARED_liBRARIES := xxx

Java中调用

<span >static {        System.loadlibrary("XXX");        System.loadlibrary("cocos2dcpp");} </span>
3、编译
编译后会在libs/armeabi目录下生产我们需要的libxxx.so文件,并编译到APK中。
4、万普例子
以下是万普平台Demo的mk文件,在这贴出来,让大家体会以下使用方法。
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODulE := uninstall  //第一步LOCAL_SRC_fileS := prebuilt/libuninstall.so   //第二步include $(PREBUILT_SHARED_liBRARY)            //第三步include $(CLEAR_VARS)$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)LOCAL_MODulE := cocos2dcpp_sharedLOCAL_MODulE_filename := libcocos2dcpp  //<span >将引用的库加上cpp源文件共同打包出libcocos2dcpp库</span>LOCAL_SRC_fileS := hellocpp/main.cpp \                   ../../Classes/AppDelegate.cpp \                   ../../Classes/HelloWorldScene.cpp\                   ../../Classes/WapsAd.cppLOCAL_C_INCLUDES := $(LOCAL_PATH)/../../ClassesLOCAL_WHolE_STATIC_liBRARIES := cocos2dx_staticLOCAL_WHolE_STATIC_liBRARIES += cocosdenshion_staticLOCAL_WHolE_STATIC_liBRARIES := cocos_extension_staticLOCAL_WHolE_STATIC_liBRARIES += Box2d_staticLOCAL_WHolE_STATIC_liBRARIES += cocostudio_static# LOCAL_WHolE_STATIC_liBRARIES += Box2d_static# LOCAL_WHolE_STATIC_liBRARIES += cocosbuilder_static# LOCAL_WHolE_STATIC_liBRARIES += spine_static# LOCAL_WHolE_STATIC_liBRARIES += cocostudio_static# LOCAL_WHolE_STATIC_liBRARIES += cocos_network_static# LOCAL_WHolE_STATIC_liBRARIES += cocos_extension_staticinclude $(BUILD_SHARED_liBRARY)include $(CLEAR_VARS)LOCAL_SHARED_liBRARIES := uninstall     //第四步$(call import-module,.)$(call import-module,audio/androID)$(call import-module,Box2D)$(call import-module,editor-support/cocostudio)$(call import-module,extensions) # $(call import-module,Box2D)# $(call import-module,editor-support/cocosbuilder)# $(call import-module,editor-support/spine)# $(call import-module,editor-support/cocostudio)# $(call import-module,network)# $(call import-module,extensions)

注意事项
在主java文件中找到System.loadlibrary("cocos2dcpp");这句,然后在下面同样添上你要加载的三方库名称即可。貌似默认不指明的话,会到系统路径下去找so文件(没有root或system的权限,无权对这个文件夹 *** 作),这几个so按道理是会装到data/appname/lib目录下的。 加载顺序 这里有个问题要尤其注意,就是这些动态库的加载顺序, 一定要放到libcocos2dcpp前加载,否则在载入libcocos2dcpp时,会因为没有之前这两个依赖的动态库而报错,报的就是对应的动态库木有载入

AndroID可行加载第三方库文档,转载自:http://blog.csdn.net/smfwuxiao/article/details/8523479

AndroID NDK r5 开始支持预编译库(动态库和静态库),即程序能使用库的预编译版本。

该特性可用于以下两方面:

1)向第三方NDK开发人员发布你的共享库而不用提供源码。
2)使用一个提前编译好的库(预编译库)来加速编译过程。

本文说明该特性如何工作。

I. 声明一个预编译库的模块 对于AndroID编译工具而言,每个预编译库必须声明为一个独立的模块。这里举一个例子,假设 libfoo.so 文件与 AndroID.mk 位于同一个目录:
[plain] view plain copy LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODulE:=foo-prebuilt LOCAL_SRC_fileS:=libfoo.so include$(PREBUILT_SHARED_liBRARY) 按以下步骤声明这样一个模块:
1. 给该模块取一个名字(这里是 foo-prebuilt)。这个名字不需要与预编译库自身的名字相同。
2. 将 LOCAL_SRC_fileS 指定为你要提供的共享库的路径。通常,该路径是相对于 LOCAL_PATH 的路径。注意:必须保证共享库ABI的兼容性。
3. 如果你的库是共享库,则包含 PREBUILT_SHARED_liBRARY 而不是 BUILD_SHARED_liBRARY;如果是静态库,则包含 PREBUILT_STATIC_liBRARY。

预编译模块不需要编译。该预编译模块会被拷贝到 $PROJECT/obj/local 下面,还会被拷贝到 $PROJECT/libs/<abi> 下面(这里的库被strip过)。

II. 在其他模块中引用这个预编译库

在依赖该预编译库的模块对应的AndroID.mk中,将预编译库的名字(前面取的)加入到 LOCAL_STATIC_liBRARIES 或 LOCAL_SHARED_liBRARIES 声明中。例如,一个使用上面libfoo.so的简单例子如下:

copy include$(CLEAR_VARS) LOCAL_MODulE:=foo-user LOCAL_SRC_fileS:=foo-user.c LOCAL_SHARED_liBRARIES:=foo-prebuilt include$(BUILD_SHARED_liBRARY)

III. 将预编译库的头文件导出

得到预编译库之后,一般需要它对应的头文件。例如前面的libfoo.so,它有对应的foo.h。编译依赖libfoo.so的模块时,需要将该头文件和它的路径提供给NDK编译系统。一种简单方法是,前面在定义该预编译库的时候,使用LOCAL_EXPORT_C_INCLUDES 变量。例如,假设文件 foo.h 位于当前预编译模块所在目录的 include 子目录,则可以在预编译模块的AndroID.mk文件中编写如下:

copy include$(CLEAR_VARS) LOCAL_MODulE:=foo-prebuilt LOCAL_SRC_fileS:=libfoo.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_liBRARY) 个 LOCAL_EXPORT_C_INCLUDES 定义确保了任何依赖这个预编译库的模块会自动在自己的 LOCAL_C_INCLUDES 变量中增加到这个预编译库的include目录的路径,从而能够找到其中的头文件。

IV. 调试预编译库

建议你在预编译库中保留调试信息。位于 $PROJECT/libs/<abi> 的版本都是不含调试信息的(被NDK编译系统执行strip过的),调试版的库才能用于 ndk-gdb。

V. 共享库ABI的选择

如前所述,共享库与目标系统的ABI兼容性至关重要。应检查一下 TARGET_ARCH_ABI 的值,可以是以下值:
armeabi 目标系统cpu是ARMv5TE或更高
armeabi-v7a 目标系统cpu是ARMv7或更高
x86 目标系统cpu是x86
注意,armeabi-v7a的cpu可以很好地执行armeabi的程序。
举一个例子,我们提供一个预编译库的两个版本,然后选择不同的ABI:

copy LOCAL_MODulE:=foo-prebuilt LOCAL_SRC_fileS:=$(TARGET_ARCH_ABI)/libfoo.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_liBRARY) 这里假设要拷贝的预编译库所在的目录结构如下:
AndroID.mk --> 编译这个预编译库的AndroID.mk
armeabi/libfoo.so --> armeabi版本的共享库
armeabi-v7a/libfoo.so --> armeabi-v7a版本的共享库
include/foo.h --> 预编译库导出的头文件
注意:你不必提供armeabi-v7a版本,因为armeabi版本的共享库能够被armeabi-v7a的兼容,但是反过来就不行。 总结

以上是内存溢出为你收集整理的Cocos2d-x中使用第三方so库全部内容,希望文章能够帮你解决Cocos2d-x中使用第三方so库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007274.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存