转载于: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
:= $(call my-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的项目,会看到最后有Install