2010-11-25 5 views
1

픽셀이 흰색인지 확인하는 간단한 반복문을 작성하여 billboarding에 도움이됩니다. 그렇다면 100 % 투명도로 설정합니다. 나는이 루프의 java 동등 물이 19 초 동안 256x256 비트 맵을 실행하는 데 걸리므로 원시 코드로 작성했습니다.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; 

}

에 대한 자동 생성 된 스텁 것은 :

[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 

이유는 이것이다 :

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

나는 이러한 오류를 얻을 사고? 내 C 코드는 잘되어야하며, 이러한 오류는별로 의미가 없다.

답변

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

(*int)의 시도도하는 것으로이 것 제대로 분리되지 적색, 녹색, 청색 :

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

방금 ​​제로를 확인하고 있음을 감안할 때, 당신은 정말 각각의 RGB 값에 대한 상관 없어, 당신은 아마 멀리로 얻을 수 있습니다 :

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

이 알파 제로 아웃합니다 픽셀에서부터 RGB 부분 만 남겨 둡니다. 이 모든 것이 0이면 각 색상이 0이어야하므로 각 색상을 개별적으로 확인할 필요가 없습니다.

마지막 생각 :

은 내가 특별히 안드로이드와 함께 많은 일을하지 않은,하지만 0x000000에서 검정과는 0xFFFFFF 흰색 아닌가요? 따라서 실제로 흰색이 아닌 검정색과 일치합니다.

3

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

또는

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

더 나은해야 (int*) 대신

3

Android.mk에서 사용하는 플래그는 무엇입니까?

당신은 LOCAL_CFLAGS을 설정 않았다 = -std = C99

또한

int *mPixels = (int*)malloc(length * 4); 
로 변경해야
관련 문제