我需要通過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. 如何在Android開發中通過JNI將位圖從Java傳遞給C++?
- 3. 如何通過ajax將圖像從html傳遞到php
- 4. 通過jni傳遞一個2d矩陣從java到C++文件
- 5. 將圖像從java applet傳遞到html
- 6. 如何使用JNI將System.out從Java傳遞到C?
- 7. JNI將樹形圖從java傳遞到c
- 8. JNI:從C++傳遞字節到java
- 9. 傳遞多個參數從Java通過JNI
- 10. 通過JNI(安卓NDK)傳遞由C到Java對象(DisplayMetrics)
- 11. 如何通過C++通過JNI傳遞擴展的ASCII字符
- 12. 通過UINavigationController傳遞圖像
- 13. 如何將Mat對象從java類傳遞給jni cpp。
- 14. 將OpenCV輪廓從JNI C++函數傳遞到Java中的Android
- 15. JNI - 將HTML文件的內容從C端傳遞到Java端
- 16. 將指針從JNI傳遞到Java使用long
- 17. 將ANSI字符串從Java傳遞到C++(JNI)
- 18. Android:將數據從jni線程傳遞到java程序
- 19. JNI通過引用傳遞失敗
- 20. Android Cocos2dX JNI Bridge
- 21. 將QByteArray圖像從C++傳遞到QML
- 22. 將圖像從Form2傳遞到Form1
- 23. 如何通過使用JNI將C結構轉移到java?
- 24. 通過單擊圖像將圖像ID傳遞給JQuery
- 25. 通過Android將圖像上傳到wordpress
- 26. 如何通過JNI發送從Java到H的HashMap
- 27. 如何通過jquery將圖像數據與圖像一起傳遞?
- 28. 如何通過java傳遞JMeter屬性
- 29. 如何通過node.js將cookie從couchd傳遞到客戶端
- 30. 使用prepareforsegue將圖像從按鈕傳遞到圖像視圖