2014-10-20 83 views

回答

3
  1. 創建Java接口forJNI像:

    public static native void setBG(int[] raw, int width, int height); 
    
  2. 在C
  3. ++代碼做:

    //Use static variable here for simplicity 
    
    int *imagedata; 
    int staticwidth; 
    int staticheight; 
    Texture2D *userBackgroundImage; 
    
    
    
    void Java_com_my_company_JniHelper_setBG(JNIEnv* env, jobject thiz, jintArray raw, jint width, jint height) 
    { 
        jint *carr; 
        carr = env->GetIntArrayElements(raw, 0); 
        if(carr == NULL) { 
         return; /* exception occurred */ 
        } 
        ssize_t dataLen = (int)width * (int)height; 
        int *data = new int[dataLen]; 
        for (long i = 0; i < dataLen; i++) 
        { 
         data[i] = carr[i]; 
        } 
        imagedata = data;//Make a copy because it need to be done in GLThread 
        staticwidth = (int)width; 
        staticheight = (int)height; 
        env->ReleaseIntArrayElements(raw, carr, 0); 
        LOGD("set image: %d * %d", width, height); 
    } 
    

然後調用以下方法某處持續時間層init或其他cocos2d- x代碼:

void createImage(const void *data, ssize_t dataLen, int width, int height) 
    { 
     Texture2D *image = new Texture2D(); 
     if (!image->initWithData(data, dataLen, Texture2D::PixelFormat::BGRA8888, width,  height, Size(width, height))) 
     { 
      delete image; 
      delete imagedata; 
      image = NULL; 
      imagedata = NULL; 
      userBackgroundImage = NULL; 
      return; 
     } 
     delete imagedata; 
     imagedata = NULL; 
     userBackgroundImage = image; 
    } 

然後,您可以使用Texture2D對象來創建一個精靈或做任何你想做

  • 從Java調用此代碼:

    public static int[] BitmapToRaw(Bitmap bitmap) { 
        Bitmap image = bitmap.copy(Bitmap.Config.ARGB_8888, false); 
        int width = image.getWidth(); 
        int height = image.getHeight(); 
        int[] raw = new int[width * height]; 
        image.getPixels(raw, 0, width, 0, 0, width, height); 
        return raw; 
    } 
    
    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.bg); 
    JniHelper.setBG(BitmapToRaw(image), image.getWidth(), image.getHeight()); 
    
  • 1

    我只是從cocos2d-x發送圖像數據到Java,所以你需要找到一種方法來顛倒這種方法。它用於捕獲節點並將其傳遞給屏幕截圖。

    CCNode* node = <some node>; 
    const CCSize& size(node->getContentSize()); 
    CCRenderTexture* render = CCRenderTexture::create(size.width, size.height); 
    
    // render node to the texturebuffer 
    render->clear(0, 0, 0, 1); 
    render->begin(); 
    node->visit(); 
    render->end(); 
    
    CCImage* image = render->newCCImage(); 
    
    // If we don't clear then the JNI call gets corrupted. 
    render->clear(0, 0, 0, 1); 
    
    // Create the array to pass in 
    jsize length = image->getDataLen(); 
    jintArray imageBytes = t.env->NewIntArray(length); 
    unsigned char* imageData = image->getData(); 
    t.env->SetIntArrayRegion(imageBytes, 0, length, const_cast<const jint*>(reinterpret_cast<jint*>(imageData))); 
    
    t.env->CallStaticVoidMethod(t.classID, t.methodID, imageBytes, (jint)image->getWidth(), (jint)image->getHeight()); 
    
    image->release(); 
    t.env->DeleteLocalRef(imageBytes); 
    t.env->DeleteLocalRef(t.classID); 
    

    Java方面看起來是這樣的:

    import android.graphics.Bitmap; 
    import android.graphics.Bitmap.Config; 
    
    public static Bitmap getImage(int[] imageData, int width, int height) { 
        Bitmap image = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
        image.setPixels(imageData, 0, width, 0, 0, width, height); 
        return image; 
    } 
    
    0

    我認爲這樣做會用Java來保存它,然後訪問來自CPP文件,然後使用後刪除它最好的,簡單的方法。

    相關問題