2010-11-25 3 views
1

Я написал простой цикл, чтобы помочь в афише, который будет проверять, является ли пиксель белым. если это так, он установит его на 100% прозрачность. Я написал его в собственном коде, потому что эквивалент java этого цикла занял 19 секунд, чтобы работать для 256x256 bitmap, слишком медленно.C код не компилируется правильно

при компиляции:

#include "org_me_renderscene_Billboard.h" 

#include <stdio.h> 
#include <stdlib.h> 

JNIEXPORT jintArray JNICALL Java_org_me_renderscene_Billboard_NativeSetAlphaWhereWhite 
    (JNIEnv *envptr, jclass jClass, jintArray pixels, jint length) 
{ 
    int *mPixels = (*int)malloc(length * 4); 

    static int currentcolor; 
    static int writecolor; 
    static int red, green, blue; 

    for(int x = 0; x < length; x++) 
    { 
     currentcolor = pixels[x]; 

     red = currentcolor << 16; 
     green = currentcolor << 8; 
     blue = currentcolor; 
     if((red == 0) && (green == 0) && (blue == 0)) 
     { 
      mPixels[x] = 0x00000000; 
     } 
     else 
     { 
      mPixels[x] = currentcolor; 
     } 
    } 

    return mPixels; 

}

автоматически сгенерированных заглушки для которых является:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class org_me_renderscene_Billboard */ 

#ifndef _Included_org_me_renderscene_Billboard 
#define _Included_org_me_renderscene_Billboard 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  org_me_renderscene_Billboard 
* Method: NativeSetAlphaWhereWhite 
* Signature: ([II)[I 
*/ 
JNIEXPORT jintArray JNICALL Java_org_me_renderscene_Billboard_NativeSetAlphaWhereWhite 
    (JNIEnv *, jclass, jintArray, jint); 

#ifdef __cplusplus 
} 
#endif 
#endif 

я получаю эти ошибки:

[email protected]:~/Documents/LinuxProgramming/EclipseWorkspace/RenderScene$ /home/thomas/Documents/LinuxProgramming/AndroidSDKs/android-ndk-r4b/ndk-build 
Compile thumb : Billboardlib <= /home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c: In function 'Java_org_me_renderscene_Billboard_NativeSetAlphaWhereWhite': 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:9: error: expected expression before 'int' 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:9: error: expected ',' or ';' before 'malloc' 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:15: error: 'for' loop initial declarations are only allowed in C99 mode 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:15: note: use option -std=c99 or -std=gnu99 to compile your code 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:17: warning: dereferencing 'void *' pointer 
/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/jni/org_me_renderscene_Billboard.c:17: error: void value not ignored as it ought to be 
make: *** [/home/thomas/Documents/LinuxProgramming/EclipseWorkspace/RenderScene/obj/local/armeabi/objs/Billboardlib/org_me_renderscene_Billboard.o] Error 1 

почему это происходит? мой код C должен быть хорошим, и эти ошибки не имеют большого смысла.

ответ

2
int *mPixels = (*int)malloc(length * 4); 

должен быть

int *mPixels = (int*)malloc(length * 4); 

или даже лучше

int *mPixels = (int*)malloc(length * sizeof(int)); 

, а также отметить, что это не будет должным образом отдельный красный, зеленый и синий :

red = currentcolor << 16; 
green = currentcolor << 8; 
blue = currentcolor; 

Учитывая, что вы просто проверка на ноль, и вы на самом деле не волнует индивидуальных значений RGB, вы, вероятно, может просто уйти с:

if ((currentcolor & 0x00FFFFFF) == 0) 

Это будет обнулять Альфа от пикселя, оставив только часть RGB. Если все это равно нулю, каждый цвет должен быть равен нулю, поэтому нет необходимости проверять каждый цвет отдельно.

Final мысль:

Я не сделал много с Android конкретно, но не 0x000000 черной и белым 0xFFFFFF? Таким образом, вы на самом деле находитесь на черном, а не белом.

3

Попробуйте (int*) вместо (*int)

3

Какие флаги вы используете в себе Android.mk?

вы установите LOCAL_CFLAGS: = -std = c99

также

вам нужно изменить, чтобы это

int *mPixels = (int*)malloc(length * 4); 
Смежные вопросы