cocos2dx_js调用本地摄像头及相册
Cocos2dx c++版本调用摄像头的案例网上很多,但是js几乎没有,于是捣鼓了一番,用c++的实现加上jsb绑定,弄出来了个,贴出来大家交流下,若有不对之处,共勉。
首先要感谢2位作者 (头像选择器)和 (Js Binding)
头像选择器给了在C++端调用相册及摄像头的源代码(C++端我没有去验证,但是js验证成功),由于是js项目,我们的逻辑代码在js端,这就涉及到了js调用C++的需求,正好我碰到了Js Binding这个方法,然后一步一步的将头像选择器添加的.h和.c++文件成功的进行了jsb绑定,然后再js代码里就能使用C++里的方法。
上面2位牛人的实现我就不重复了,(切记:按照步骤来,不懂的步骤不要忽略,很容易报错。),下面是我实现了jsb绑定之后碰到的问题。
准备环境:
cocos3.9引擎
java
Python2.7
adt-bundle-windows-x86_64-20140702
android-ndk-r9d
apache-ant-1.9.4
这些环境配了之后能跑cocos项目
py-yaml
cheetah
这2个环境配了可以自动绑定jsb
文本编辑器---Notepad++,后面简称文本编辑器
上面这些软件我会传到百度云上,不会下的有福利了。环境如何配置就不说了(罗嗦)
选择一个目录 打开命令行,输入cocos new callcamera –p com.game.callcamera–l js 回车,新建项目则会在当前目录创建成功
这时在项目目录打开命令行输入cocos compile –p android 回车,静静的等它编译完成则会在项目目录simulator生成/android/***-debug.apk,这个debug可以直接在安卓手机上运行了。
接下来可以进行下一步。由于是js,头像选择器是C++版本的,所以先参照头像选择器,然后再用jsb绑定后在js里使用。
将下载文件夹里的ImagePicker打开,将Classes里的ImagePicker.cpp和ImagePicker.h复制到callcamera\frameworks\runtime-src\Classes目录下
将ImagePicker里的Resources里的资源复制到callcamera\res
将ImagePicker/android/ImagePicker.java复制到callcamera\frameworks\runtime-src\proj.android\src\org\cocos2dx\lib下
用文本编辑器打开callcamera\frameworks\runtime-src\proj.android\src\org\cocos2dx\javascript里的AppActivity.java,重写onCreate()和onActivityResult()方法,如下图
用文本编辑器打开callcamera\frameworks\runtime-src\proj.android下的AndroidManifest.xml,添加相机访问权限<uses-permission android:name="android.permission.CAMERA"/> 如下图
修改callcamera\frameworks\runtime-src\Classes下的ImagePicker.cpp里的宏定义”JAVA_CLASS”如下图
安卓的准备工作已经就绪,现在开始jsb绑定,jsb绑定一定注意下面的:
Android NDK 版本一定要是r9b,不管它cocos版本要求的是什么版本的ndk,这里一定要用r9b,不然不成功!!!!!切记!!!!
复制引擎下面的引擎下面的cocos2d-x-3.9\tools\bindings-generator到项目下面的callcamera\frameworks\cocos2d-x\tools,如下图
1--->在callcamera\frameworks\cocos2d-x\tools\tojs这个目录下仿照cocos2dx.ini写一个cocos2dx_ImagePicker.ini文件
2--->这个文件配置好了之后,在这个目录E:\fish_app\callcamera\frameworks\cocos2d-x\tools\tojs下修改genbindings.py,
(如果名字跟我取得一样的,1,2两步就完全可以用我给的项目里的这个文件,如果名字不一样则需要参照jsb绑定教程上面的方法)打开命令行,输入python genbindings.py 则会给前面添加的C++文件进行jsb绑定,绑定成功会提示成功,绑定失败则会提示失败。如果提示失败,则要检查配置环境,检查之后重新来一次,总会成功。
绑定成功之后会在callcamera\frameworks\cocos2d-x\cocos\scripting\js-bindings\auto目录下生成3个文件:jsb_cocos2dx_ImagePicker.cpp,jsb_cocos2dx_ImagePicker.hpp,api/jsb_cocos2dx_ImagePicker_api.js
既然新增加了文件,就需要改安卓的配置(2个地方)
callcamera\frameworks\cocos2d-x\cocos\scripting\js-bindings\proj.android目录下用文本编辑器打开Android.mk,将jsb_cocos2dx_ImagePicker.cpp添加进去,如下图
callcamera\frameworks\runtime-src\proj.android\jni目录下用文本编辑器打开Android.mk,将ImagePicker.cpp添加进去,如下图
然后命令行编译,步骤没错则编译成功,迫不及待的装到手机上试,结果可以选择相册,但是拍照后无法载入,检查代码,c++和js层都没有问题,最后将项目导入到eclipse,导入方法,在adt-bundle-windows-x86_64-20140702\eclipse目录下打开eclipse.exe,在eclipse下File->Import…General->Existing Projects into Workspace->next->Broese…
项目在eclipse里打开,发现有报错,(报错是正常的,都报错)2步走:
将callcamera\frameworks\cocos2d-x\cocos\platform\android\java\libs目录下android-async-http-1.4.8.jar复制到callcamera\frameworks\runtime-src\proj.android\libs下
将E:\fish_app\callcamera\frameworks\cocos2d-x\cocos\platform\android\java\src复制到callcamera\frameworks\runtime-src\proj.android\src下,
做了这2步后eclipse下刷新一下然后再看错误有没有,没有了就可以直接连手机
(这里说明一下,因为之前用命令行编译了,所以可以直接debug将项目装到手机上,如果想用命令行编译,则需要将刚才复制过来的都去掉才能编译成功,用命令行编译最好将callcamera\frameworks\runtime-src\proj.android下的assets,bin,gen,libs,obj,都删掉,如果c++文件没有修改的话obj,则不删,因为编译obj要很长很长时间,编译成功后要再用eclipse调试则需要重复上面的2步(步骤太恶心了,太繁琐了))
好了,连上手机后开始测试,还是用相机拍摄之后无法载入,查看java代码,发现
对比读取相册和拍照,拍照是将照片存到了一个地方,然后在回调里取相片的时候从那个地址去取,然后就失败了,具体哪里失败没有细究,为什么要存到指定位置呢!!然后将intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(activity.getFilesDir(), "@cc_cameraCache.jpg"))); 这一句注释掉,查资料说这一句是存储拍照的照片到指定位置,不指定就在默认位置,在回调里Intent data,data也有照片的值,直接用跟在相册里的方法一致,试一试,坑爹的竟然行!!!
安卓测试通过!!!
上面的一堆废话只是操作的过程,具体代码已经贴出来了,再次感谢分享方法的2位大大,及所有分享总结的大大们。
Ios的有时间再贴出来,能看到这里的估计也不用再看ios的了。
中间如果有什么不对的或者不清楚的欢迎批评指正。
参考文章:(头像选择器)http://blog.****.net/rainb00000w/article/details/46365497
(Js Binding)http://blog.****.net/sinat_28338727/article/details/53115797
项目及环境地址
链接:http://pan.baidu.com/s/1skXbbq9 密码:9dyn