2011-10-06 10 views
12

Mam trochę kodu C++ opartego na NDK, który potrzebuje do zbudowania obiektu bitmapowego Android. Jestem pewien, że istnieje sposób, aby to zrobić bezpośrednio z kodu C++ ale nie jest najłatwiejsze rzeczy do zrobienia;)Tworzenie pliku android.graphics.Bitmap z C++

Więc metoda chcę zadzwonić to

Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

Więc to zrobić z natywnego kodu muszę wykonać następujące kroki.

  • Znajdź klasę (android.graphics.Bitmap).
  • Uzyskaj statyczny identyfikator metody "createBitmap".
  • Utwórz wyliczenie.
  • Wywołanie metody statycznej.

(W końcu będę musiał utworzyć jintArray i przekazać dane, ale o to później się martwię).

Jestem bardzo zagubiony na krokach 2 i 3 chociaż. Mój kod wygląda teraz tak:

jclass  jBitmapClass  = gpEnv->FindClass("android.graphics.Bitmap"); 
jmethodID jBitmapCreater  = gpEnv->GetStaticMethodID(jBitmapClass, "createBitmap", "(IILandroid/graphics/Bitmap/Config;)Landroid/graphics/Bitmap;"); 

, ale potem utknąłem. Jak utworzyć wyliczenie z natywnego kodu C/C++?

Co więcej, mój ostatni parametr w GetStaticMethodID jest poprawny? Nie byłem pewien, jak określić konkretne obiekty, ale myślę, że powyższe działa. Jednak może być źle na wyliczeniu!

Z góry dziękuję.

Odpowiedz

19

mam to w moim kodu, więc mogę ci dać odpowiedź, która działa.

1) Get statycznej metody id createBitmap (int szerokość, int wysokość, Bitmap.Config config):

jclass java_bitmap_class = (jclass)env.FindClass("android/graphics/Bitmap"); 
jmethodID mid = env.GetStaticMethodID(java_bitmap_class, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); 

Uwaga podpisania Bitmap.Config, posiada znak $ w nim.

2) Tworzenie enum dla Bitmap.Config z danej wartości:

const wchar_t config_name[] = L"ARGB_8888"; 
jstring j_config_name = env.NewString((const jchar*)config_name, wcslen(config_name)); 
jclass bcfg_class = env.FindClass("android/graphics/Bitmap$Config"); 
jobject java_bitmap_config = env.CallStaticObjectMethod(bcfg_class, env.GetStaticMethodID(bcfg_class, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"), j_config_name); 

Tutaj tworzymy Bitmap.Config enum z imieniem wartości. Innym możliwym łańcuchem wartości jest "RGB_565".

3) Wywołanie createBitmap:

java_bitmap = env.CallStaticObjectMethod(java_bitmap_class, mid, w, h, java_bitmap_config); 
+0

Ahh genialne użycie ukośników zamiast "." W moim FindClassie jest samo w sobie ratujące życie !! :) – Goz

+3

Twój kod spowodował awarię, ale kiedy zmieniłem ciąg konfiguracyjny, zadziałało: jobject java_bitmap_config = env-> CallStaticObjectMethod (bcfg_class, midValueOf, env-> NewStringUTF ("ARGB_8888")); –

+0

jako, że env jest wskaźnikiem, musisz również zmienić "env."do" env-> " – Tertium