coco2dx jni 調用 java 相機返回 圖片數據

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

eclipse 導入項目配置 。。。 略去,(能夠google)

1 c++ 調用 andriod python

  1.1 包含頭文件android

#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類裏的表靜態函數)c++

#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 類裏 加個靜態函數 testFuneclipse

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); //調用相機,結果在下個函數返回
    } 

    再加個相機返回的處理函數 ide

  @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++的類裏面,先聲明一下函數。如上面 SetImgBytethis

  再在c++裏寫上 按 jni 格式的 代碼:google

  

#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
相關文章
相關標籤/搜索