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类里的表静态函数)

coco2dx jni 调用 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
coco2dx jni 调用 java 相机返回 图片数据

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

 

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

coco2dx jni 调用 java 相机返回 图片数据
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); //调用相机,结果在下个函数返回
    } 
coco2dx jni 调用 java 相机返回 图片数据

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

coco2dx jni 调用 java 相机返回 图片数据
  @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++
       }
     }
   }
coco2dx jni 调用 java 相机返回 图片数据
private static native void SetImgByte(final int pWidth,
            final int pHeight, final byte[] pPixels); /// 连接到c++里的函数,在testJin 类里先声明一下, 静态

 

  2 java 调用 c++ 

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

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

  

coco2dx jni 调用 java 相机返回 图片数据
#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
coco2dx jni 调用 java 相机返回 图片数据

 

  

 

coco2dx jni 调用 java 相机返回 图片数据,布布扣,bubuko.com

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

上一篇:How to install JDK (Java Development Kit) on Linux


下一篇:Top 10 Mistakes Java Developers Make--reference