2011-04-09 21 views

cevap

16

jnigraphics kitaplığı, android.bitmap.Graphics sınıfından (tabii ki Java'da) C/C++ içindeki bitmap arabelleklerine erişmek için kullanılabilir. Bu altında NDK birlikte gelen belgelerde daha ayrıntılı olarak tanımlanıyor:

android-ndk-r5b/docs/STABLE-APIS.html 
örneğin için görüntü yüklemek için kullanılabilecek

C/C++ içinde OpenGL ES, ancak bir kitaplığa doğrudan erişim sağlamak için bu kitaplığa bir jobject vermek için bazı işler yapmak zorunda. Bu arabelleği glTexImage2D() aracılığıyla OpenGL'ye geçirebilirsiniz.

#include <android/bitmap.h> 

void MyJniMethod(JNIEnv *env, jobject obj, jobject bitmap) { 
AndroidBitmapInfo info; 
uint32_t   *pixels; 
int    ret; 

AndroidBitmap_getInfo(env, bitmap, &info); 

if(info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { 
    LOGE("Bitmap format is not RGBA_8888!"); 
    return false; 
} 

AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels)); 

// Now you can use the pixel array 'pixels', which is in RGBA format 

} 

Tut: yerli yöntem şöyle bakabilirsiniz

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
     ... 

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = false; 

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
              R.drawable.myimage, options); 

MyJniMethod(bitmap); // Should be static in this example 

O:

Öncelikle, kazanmak ve bu gibi doğal yönteme geçebilir bir Java Bitmap nesne, gerek Piksel tamponu ile işiniz bittiğinde AndroidBitmap_unlockPixels() numaralı telefonu aramanız gerektiğini ve bu örneğin hiç bir hata olup olmadığını kontrol etmemelisiniz. Sid Datta sorusuna ilişkin


Güncelleme: Sen çıktı resim biçimi Yukarıdaki seçeneklere bu ekleyerek bekliyorsanız ne şekilde belirtebilirsiniz:

options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

bir durum vardır nerede çıktı görüntüsü olacak hala, JNI'de bilinmeyen bir formatla sonuçlanır. Bu sadece GIF'lerle gerçekleşiyor. BitmapFactory.decodeResource() çağırdıktan sonra gerekirse uygun biçimine dönüştürme yapabilirsiniz:

if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { 
    Bitmap reformatted_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); 
    bitmap.recycle(); /* reduce memory load in app w/o waiting for GC */ 
    bitmap = reformatted_bitmap; 
} 
+0

o Piksel Android'in tüm sürümlerinde, RGBA formatında paketlenmiş olduğunu garantisi var mı? –