1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| jobject createBitmap(JNIEnv* env, jclass bitmapCls, IMAGE image){ LOGE("creating new bitmap..."); int ret; unsigned char* newBitmapPixels; jmethodID createBitmapFunction = env->GetStaticMethodID(bitmapCls, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); jstring configName = env->NewStringUTF("ARGB_8888"); jclass bitmapConfigClass = env->FindClass("android/graphics/Bitmap$Config"); jmethodID valueOfBitmapConfigFunction = env->GetStaticMethodID(bitmapConfigClass, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"); jobject bitmapConfig = env->CallStaticObjectMethod(bitmapConfigClass, valueOfBitmapConfigFunction, configName); jobject newBitmap = env->CallStaticObjectMethod(bitmapCls, createBitmapFunction, NN_RECT_SIZE*MAX_LETTER_COUNT, NN_RECT_SIZE, bitmapConfig); if ((ret = AndroidBitmap_lockPixels(env, newBitmap, (void**)&newBitmapPixels)) < 0){ LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret); }
unsigned char *b = image.buffer; for(int i = 0; i < image.width * image.height; i++){ unsigned char g = b[i]; newBitmapPixels[i*4] = g; newBitmapPixels[i*4+1] = g; newBitmapPixels[i*4+2] = g; newBitmapPixels[i*4+3] = 255; } free(b);
AndroidBitmap_unlockPixels(env, newBitmap); return newBitmap; }
JNIEXPORT jobjectArray JNICALL Java_com_example_fonter_nncrdemo_Load_returnBitmapArray (JNIEnv* env, jobject obj, jobject bitmap) { LOGE("reading bitmap info..."); AndroidBitmapInfo info; int ret; if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0){ LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret); return NULL; } LOGE("width:%d height:%d stride:%d", info.width, info.height, info.stride); if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { LOGE("Bitmap format is not RGBA_8888!"); return NULL; }
LOGE("reading bitmap pixels..."); unsigned char* bitmapPixels; if ((ret = AndroidBitmap_lockPixels(env, bitmap, (void**)&bitmapPixels)) < 0) { LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret); return NULL; }
LOGE("creating new array..."); jclass bitmapCls = env->GetObjectClass(bitmap); jobjectArray infos = env->NewObjectArray(BITMAPS_SIZE, bitmapCls, NULL); IMAGE images[BITMAPS_SIZE]; int s = parseWaveToArray(bitmapPixels, info.width, info.height, images); LOGE("s = %d", s); int i; for(i = 0; i < s; i++) { jobject bp = createBitmap(env, bitmapCls, images[i]); env->SetObjectArrayElement(infos, i, bp); }
AndroidBitmap_unlockPixels(env, bitmap); return infos; }
|