Android NDK'da JNI Graphics adlı bir kütüphane var. O nedir? C/C++ ile OpenGL ES için görüntüleri yüklemek için kullanabilir miyim?JNI Graphics nedir veya nasıl kullanılır?
cevap
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;
}
o Piksel Android'in tüm sürümlerinde, RGBA formatında paketlenmiş olduğunu garantisi var mı? –