cocos2dx_js调用本地摄像头及相册

来源:互联网 发布:arm linux入门 编辑:程序博客网 时间:2024/06/06 20:23

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-permissionandroid: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.csdn.net/rainb00000w/article/details/46365497

 (Js Binding)http://blog.csdn.net/sinat_28338727/article/details/53115797

项目及环境地址

链接:http://pan.baidu.com/s/1skXbbq9 密码:9dyn


原创粉丝点击