首页 > 代码库 > coco2dx jni 调用 java 相机返回 图片数据

coco2dx jni 调用 java 相机返回 图片数据

新建 一个项目 名字:testJin  包名:com.TanSon.org  python命令:python create_project.py -project testJin -package com.TanSon.org -language cpp 

eclipse 导入项目配置 。。。 略去,(可以google)

1 c++ 调用 andriod 

  1.1 包含头文件

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
#include <jni.h> 
#include "platform/android/jni/JniHelper.h" 
#include <android/log.h> 
#endif 

  1.2 通过 jni 调用 java ,,(请里是调用java类里的表静态函数)

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 
JniMethodInfo minfo;//定义Jni函数信息结构体
  // com/TanSon/org/ 是建项目时的包签名,用 ‘/‘ 替换 ‘.‘ , testJin 类名,建项目时,cocos2dx 自动以项目名字,在对应 com/TanSon/org/ 里创建的一个类。 testFun: 要调用java 的函数,"()V" :括号里是参数,后是返回值,这里是无参无返回
  bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/TanSon/org/testJin","testFun", "()V"); 
  if (!isHave) 
   {
     CCLOG(
"jni:此函数不存在");
   }
  
else{
    CCLOG(
"jni:此函数存在");
    
//调用此函数
    minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
  }
  CCLOG(
"jni-java函数执行完毕");
#endif

  

 

  1.3 java 里的函数编写 ,,在 testJin 类里 加个静态函数 testFun

static public  void testFun() { 
        Log.e("tanson", "testFun call in java"); 
         
         Activity context = (Activity) Cocos2dxHelper.getsContext();
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
         context.startActivityForResult(intent, 1); //调用相机,结果在下个函数返回
    } 

    再加个相机返回的处理函数 

  @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  //相机返回

        super.onActivityResult(requestCode, resultCode, data);  
        if (resultCode == Activity.RESULT_OK) {  
            
            //显示图片名字
            String name = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg";     
            Toast.makeText(this, name, Toast.LENGTH_LONG).show();  
            Bundle bundle = data.getExtras();  
            Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式  
            
            if (bitmap != null) {
                final byte[] pixels = new byte[bitmap.getWidth()
                        * bitmap.getHeight() * 4];
                final ByteBuffer buf = ByteBuffer.wrap(pixels);
                buf.order(ByteOrder.nativeOrder());
                bitmap.copyPixelsToBuffer(buf);
                testJin.SetImgByte(bitmap.getWidth(),bitmap.getHeight(), pixels);  // SetImgByte 函数下面讲,,这个是 java 调用c++ 函数,把图片数据传到c++
       }
     }
   }
private static native void SetImgByte(final int pWidth,
            final int pHeight, final byte[] pPixels); /// 连接到c++里的函数,在testJin 类里先声明一下, 静态

 

  2 java 调用 c++ 

  在要调用 c++的类里面,先声明一下函数。如上面 SetImgByte

  再在c++里写上 按 jni 格式的 代码:

  

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

extern

"C"

{
  // 格式  Java_ + 类的路径,+ 函数名字 ,参数前两个不变,后机是java 调用传过来的参数
    void Java_com_TanSon_org_testLua2_SetImgByte(JNIEnv*  env, jobject thiz,int width, int height,jbyteArray pixels)

    {
        int size = width * height * 4;
        unsigned char * pImgData  = http://www.mamicode.com/new unsigned char[size];
        env->GetByteArrayRegion(pixels, 0, size, (jbyte*)pImgData);
        CCLOG("=========java call c++ SetImgByte() size:%d",size);
        
        AppDelegate::sImgData = pImgData;
        
        // HelloWorld::changeStr = tempStr;
    }

}

#endif