C код не компилируется правильно - PullRequest
1 голос
/ 25 ноября 2010

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

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

#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

я получаю следующие ошибки:

thomas@THOMASDESKLINUX:~/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 должен быть в порядке, и эти ошибки не имеют особого смысла.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

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

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

также

вам нужно перейти на это

int *mPixels = (int*)malloc(length * 4);
3 голосов
/ 25 ноября 2010

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

2 голосов
/ 25 ноября 2010
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.Если все это значение равно нулю, каждый цвет должен быть равен нулю, поэтому нет необходимости проверять каждый цвет по отдельности.

Заключительная мысль:

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

...