我需要通過JNI將圖像數據從java端傳遞給cocos2d-x。我如何實現它? JNI函數的參數應該是什麼以及如何在cocos2d-x一側投射?如何通過JNI將圖像從Java傳遞到Cocos2d-x?
2
A
回答
3
創建Java接口forJNI像:
public static native void setBG(int[] raw, int width, int height);
在C
++代碼做:
//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文件,然後使用後刪除它最好的,簡單的方法。
相關問題
- 1. 如何通過JNI將大型結構從C傳遞到JAVA
- 2. 如何通過ajax將圖像從html傳遞到php
- 3. 將圖像從java applet傳遞到html
- 4. JNI將樹形圖從java傳遞到c
- 5. JNI:從C++傳遞字節到java
- 6. 如何通過C++通過JNI傳遞擴展的ASCII字符
- 7. 將OpenCV輪廓從JNI C++函數傳遞到Java中的Android
- 8. 將指針從JNI傳遞到Java使用long
- 9. 將ANSI字符串從Java傳遞到C++(JNI)
- 10. JNI通過引用傳遞失敗
- 11. 如何通過使用JNI將C結構轉移到java?
- 12. 通過Android將圖像上傳到wordpress
- 13. 如何通過jquery將圖像數據與圖像一起傳遞?
- 14. 如何通過java傳遞JMeter屬性
- 15. 將圖像從一個視圖傳遞到其他圖像
- 16. 使用prepareforsegue將圖像從按鈕傳遞到圖像視圖
- 17. 如何將圖像從數據庫傳遞到JavaScript?
- 18. 如何將圖像從html頁面傳遞到.aspx頁面?
- 19. 如何將圖像從Flash傳遞到ASP.NET?
- 20. 通過ajax將數據從視圖傳遞到控制器
- 21. 通過web服務傳遞圖像
- 22. 通過JSP將變量傳遞給Java?
- 23. 如何從Java JNI
- 24. 如何通過GET將「字符串」值從視圖傳遞到控制器
- 25. 如何通過意圖將數據從服務傳遞到Android中的BroadcastReceiver
- 26. 如何通過BufferedImage將巨大的圖像加載到Java?
- 27. Android JNI:將std :: string傳遞給Java並返回到C++
- 28. 傳遞字符串數組從Java到C與JNI
- 29. JNI從C傳遞一個字符串到java
- 30. 通過意圖傳遞圖像到putExtra的多個活動