zoukankan      html  css  js  c++  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  = 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

      

  • 相关阅读:
    skimage的安装,scikit-image
    今天开始看看brpc-baidurpc
    Silk Mobile – 缩短移动应用的测试周期
    将Controller中的数据传递到View中显示
    常用排序算法总结(二) ---- 插入排序,快速排序
    关于二叉搜索树及三种树遍历的特点
    poj
    元数据(meta-data)
    《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权
    UVA 674 Coin Change 换硬币 经典dp入门题
  • 原文地址:https://www.cnblogs.com/sanjin/p/3737135.html
Copyright © 2011-2022 走看看