怎样在cocos2Dx项目里加so库

怎样在cocos2Dx项目里加so库,第1张

概述转载于:http://blog.sina.com.cn/s/blog_520328990101kau5.html 正题 一般支付SDK的接入,都有客户端和服务端,服务端不在本篇文章的讨论范围内,仅仅讲客户端,并且,这里只讲Android方面的,iOS的我也不怎么懂。反正所有的模式都是至少提供一个jar包,给Java作为调用入口,然后如果有涉及较为底层的 *** 作,都会由一个.so动态库文件来搞定。一般来

转载于:http://blog.sina.com.cn/s/blog_520328990101kau5.HTML

正题 一般支付SDK的接入,都有客户端和服务端,服务端不在本篇文章的讨论范围内,仅仅讲客户端,并且,这里只讲AndroID方面的,iOS的我也不怎么懂。反正所有的模式都是至少提供一个jar包,给Java作为调用入口,然后如果有涉及较为底层的 *** 作,都会由一个.so动态库文件来搞定。一般来讲,如果是原生的AndroID程序,不用涉及到C/C++的 *** 作,所以,这个so文件都是直接放到AndroID工程下的libs/armeabi文件夹下(当然针对cpu不同会有不同版本提供),至少他们的demo都会这样书写,并且的帮助文档中会告诉你,只要把这个so文件拷贝到对应的目录下即可。但是如果碰到cocos2dx,那就没那么好搞定了。因为本身这个框架的特性就决定了编写的都是动态库,然后由Activity去调用加载起来。Eclipse每次build都会把proj.androID/libs/armeabi文件夹(其他cpu类型对应的文件夹也一样)清空,你把SDK中带的那些*.so文件拷贝过去没用,压根打包不进apk里面。这里就要用到一个makefile的动态库模块加载。
PREBUILT 其实本身cocos2dx生成的AndroID工程就是会加载很多prebuilt的,比如JPG处理啊,PNG处理啊,curl啊之类的,可以参考cocos2dx/platform/third_party/androID/prebuilt目录,都放这里呢,不过不同的是这些都是静态库,我之前顺便加到项目中的iconv和libevent也都是照样画葫芦得加载进来的,但是现在碰到的是动态库,会有些许的不同,但是大致还是一样的套路。方法也就是在jni/AndroID.mk上做文章,在这个makefile中,把动态库模块罗列在这里,让程序去加载即可。这里需要去了解下NDK_MODulE_PATH是什么,还有makefile中的call import-module函数命令(不知道这样说是否正确)。
编写动态库(SHARED_liBRARY)模块

说说就拿360说事儿。怎么把jar的SDK整合进去我就不展开了,具体说如何搞定里面的libpaypalm_app_plugin_jar_360game.so

首先需要编写一个独立的动态库模块,这里说的编写,其实就相当于声明一样,告诉编译器,去哪里找什么文件链接到程序罢了,只是写个makefile,AndroID.mk。你可以放在当前程序的jni下,新建一个libprebuilt文件夹,然后搞个armeabi的文件夹(其他文件夹类同,360貌似是提供了两个的,不过我编译的都是armeabi类型的),把libpaypalm_app_plugin_jar_360game.so这个动态库放进去。在libprebuilt目录下新建一个AndroID.mk,内容如下:

[plain]view plaincopy LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODulE:=paypalm_app_plugin_jar_360game LOCAL_SRC_fileS:=$(TARGET_ARCH_ABI)/libpaypalm_app_plugin_jar_360game.so include$(PREBUILT_SHARED_liBRARY)

稍微解释下。

LOCAL_MODulE,这个是模块的名称,在其他地方引用这个模块,就填这个名字,一般是动态库去掉头部的lib和尾部的.so剩余的字符 LOCAL_SRC_fileS,如果是纯三方库的话,只需要填上库的路径即可,前面的TARGET_ARCH_ABI就是用来适配你编译的cpu类型的,会去对应的文件夹下找 PREBUILT_SHARED_liBRARY,表明这个一个与编译的动态库,这点很重要,和静态库区分 如下 好了,剩下的就是在jni/AndroID.mk中去引用这个动态库了。 copy LOCAL_SHARED_liBRARIE:=paypalm_app_plugin_jar_360game
做这一步还不够,因为makefile只知道要加载这个动态库,但是不知道去哪里加载,还需要把刚才编写的AndroID.mk包含进来,最简单的方法就是 include$(LOCAL_PATH)/libprebuilt/AndroID.mk
好了,这样build的项目,会看到最后有Installlibpaypalm_app_plugin_jar_360game.so的字样,在apk中的libs下也会找到对应的*.so文件,至少,我接入的360支付算是通了。如果还是不行,请再往下看,毕竟我没有去研究过原理,不敢打包票说一定能用。
如何加载两个.so 这个问题是我在接入移动MM的支付时遇到的,首先在makefile上折腾了好久。移动MM的支付有两个动态库需要加载,其实也可以用上面的方式来照样画葫芦,但是因为需要include两次(分别是两个*.so的模块),但是因为$(LOCAL_PATH)这个变量会变化(好多 *** 作都会导致其变化,甚至在include一个makefile——有带$(LOCAL_PATH)的参数时也会导致直接定位到那个文件夹下,但是这样写出来的makefile会看起来很混乱)。其实完全可以使用之前加载静态库的模块的方式,这里可以用到call import-module函数来搞定。不过在说这个之前,有个概念要搞清楚,什么是NDK_MODulE_PATH,并且,这个东西是在哪里定义的。 什么是NDK_MODulE_PATH

这个我不多说,从字面上解释就是模块路径,其实也就是调用call import-module时的搜索路径。这个可以具体看篇简单的参考文章:点这里


NDK_MODulE_PATH是哪里定义的 这个其实搜下文件夹就知道了,它是定义在build_native.sh中的,我的版本中定义的是cocos2dx目录和对应的platform/third_party/androID/prebuilt下。 好了,了解了以上两个小概念,就可以继续下去了。我们可以使用$(call import-module,xxx)来加载,把自己需要加载的模块(.so文件)和对应写好的AndroID.mk文件放到这个prebuilt文件夹下(自己分个类文件夹即可),然后直接call即可,参照其他静态库的加载方式,你自己的jni/AndroID.mk最下面都是的。然后再在makefile中加上你需要加载的动态库模块,如 LOCAL_SHARED_liBRARIES:=IDentifyappcasdkjni
好了,build下试试,应该在最后会显示Install IDentifyapp.so和 Install casdkjni.so这样的输出,这表示这两个动态库被打包进了Apk中。但是不幸的是,经过这样,移动MM的支付调用起来还是会出现加载这几个so文件失败导致初始化失败的提示,其实就差最后一步。
关键一步 在主java文件中找到System.loadlibrary("cocos2dcpp");这句,然后在下面同样添上你要加载的三方库名称即可。貌似默认不指明的话,会到系统路径下去找so文件(没有root或system的权限,无权对这个文件夹 *** 作),这几个so按道理是会装到data/appname/lib目录下的。 [java] static{ System.loadLibrary("identifyapp"); System.loadLibrary("casdkjni"); System.loadLibrary("cocos2dcpp"); } 加载顺序 这里有个问题要尤其注意,就是这些动态库的加载顺序, 一定要放到libcocos2dcpp前加载,否则在载入libcocos2dcpp时,会因为没有之前这两个依赖的动态库而报错,报的就是对应的动态库木有载入


相关话题文档:cocos2dx使用第三方so库

总结

以上是内存溢出为你收集整理的怎样在cocos2Dx项目里加so库全部内容,希望文章能够帮你解决怎样在cocos2Dx项目里加so库所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存