2010-11-25 16 views
1

Ich habe eine einfache Schleife geschrieben, um beim Billboarding zu helfen, das prüft, ob ein Pixel weiß ist. Wenn ja, wird es auf 100% Transparenz gesetzt. Ich habe es in nativem Code geschrieben, weil das Java-Äquivalent dieser Schleife 19 Sekunden benötigte, um für eine 256x256 Bitmap zu laufen, zu langsam.C-Code nicht richtig kompiliert

beim Kompilieren:

#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; 

}

die automatisch generierte Stub, für die:

/* 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 

ich diese Fehlermeldungen erhalten:

[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 

warum ist das Ereignis? Mein C-Code sollte in Ordnung sein, und diese Fehler machen wenig Sinn.

Antwort

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

sollte

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

oder noch besser

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

und auch beachten Sie, dass dies nicht richtig getrennt rot, grün und blau :

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

Da Sie nur für Null Überprüfung, und Sie nicht wirklich über die einzelnen RGB-Werte, können Sie wahrscheinlich nur erhalten weg mit:

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

Dies wird die Alpha Null aus aus dem Pixel, hinterlässt nur den RGB-Anteil. Wenn das Ganze Null ist, muss jede Farbe Null sein, so dass es nicht notwendig ist, jede Farbe einzeln zu prüfen.

letzter Gedanke:

Ich habe nicht viel mit Android speziell gemacht, aber ist nicht 0x000000 schwarz und weiß 0xFFFFFF? Sie passen also hier auf Schwarz statt auf Weiß.

3

Versuchen (int*) statt (*int)

3

Welche Flags verwenden Sie in Ihrem Android.mk?

hast Du LOCAL_CFLAGS: = -std = c99

auch

Sie müssen diese

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