• 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

      

  • 相关阅读:
    UVa 1451 Average (斜率优化)
    POJ 1160 Post Office (四边形不等式优化DP)
    HDU 3507 Print Article (斜率DP)
    LightOJ 1427 Substring Frequency (II) (AC自动机)
    UVa 10245 The Closest Pair Problem (分治)
    POJ 1741 Tree (树分治)
    HDU 3487 Play with Chain (Splay)
    POJ 2828 Buy Tickets (线段树)
    HDU 3723 Delta Wave (高精度+calelan数)
    UVa 1625 Color Length (DP)
  • 原文地址:https://www.cnblogs.com/sanjin/p/3737135.html
Copyright © 2020-2023  润新知