2013-03-18 74 views
1

我想在JNI中使用此代碼,而不必返回Java將createBitmap從Java轉換爲JNI

我已經將位圖操作轉換爲JNI(感謝其他stackoverflow海報),但這看起來更復雜,因爲我不明白如何調用構造函數。

Bitmap bmp; 
bmp = ((BitmapDrawable)imgview.getDrawable()).getBitmap(); 
if (bmp == null || !bmp.isMutable()) 
    Bitmap bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888); 

    // bitmap manipulations goes here 
    jclass java_bitmap_class = (env)->GetObjectClass(java_bitmap); 
    class SkBitmap; 
    SkBitmap *sk_bitmap = (SkBitmap*)(env)->CallIntMethod(
     java_bitmap, (env)->GetMethodID(java_bitmap_class, "ni", "()I")); 
    // there is more c++ code to manipulate bmp, but it is not relevant to a question 

imgview.setImageBitmap(bmp); 

回答

1

好的,它確實很簡單,一旦你掌握java-> jni翻譯。基本上,你可以在JNI中做任何你可以在Java中做的事情。是的,它看起來很混亂。我決定不在JNI中創建位圖,但是要訪問現有的位圖。

JNIEnv* Env = 0; jobject Obj; 
jclass cls = 0, ClassImageView = 0, class_drawable = 0, java_bitmap_class = 0; 
jmethodID jcontrol_ui = 0, jfindViewById = 0, jgetBitmap = 0, jgetDrawable = 0; 

int *getViewBitmapBuffer(int ID) { 
    jobject image_view = (jobject) (Env)->CallObjectMethod(Obj, jfindViewById, ID); 
    // some values can be cached, hence the checks for "(something == 0)" 
    if (ClassImageView == 0) ClassImageView = (Env)->GetObjectClass(image_view); 
    if (jgetDrawable == 0) jgetDrawable = (Env)->GetMethodID(ClassImageView, "getDrawable", sig_drawable); 
    jobject drawable = (jobject) (Env)->CallObjectMethod(image_view, jgetDrawable); 
    if (class_drawable == 0) class_drawable = (Env)->GetObjectClass(drawable); 
    if (jgetBitmap == 0) jgetBitmap = (Env)->GetMethodID(class_drawable, "getBitmap", sig_bitmap); 
    jobject java_bitmap = (jobject) (Env)->CallObjectMethod(drawable, jgetBitmap); 
    if (java_bitmap_class == 0) java_bitmap_class = (Env)->GetObjectClass(java_bitmap); 
    class SkBitmap; 
    SkBitmap *sk_bitmap = (SkBitmap*)(Env)->CallIntMethod(java_bitmap, (Env)->GetMethodID(java_bitmap_class, "ni", "()I")); 
    SkPixelRef *sk_pix_ref; 
    sk_pix_ref = (SkPixelRef*)((int*)sk_bitmap)[1]; 
    int *B = (int*) sk_pix_ref->GetPixels(); 
    return B; 
}