簡體   English   中英

C代碼無法正確編譯

[英]C code not compiling correctly

我編寫了一個簡單的循環來輔助廣告牌,該廣告牌將檢查像素是否為白色。 如果是這樣,它將設置為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代碼應該沒問題,這些錯誤沒有多大意義。

嘗試使用(int*)而不是(*int)

您在Android.mk中使用哪些標志?

您是否設置了LOCAL_CFLAGS:= -std = c99

您需要更改為此

int *mPixels = (int*)malloc(length * 4);
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)

這會將像素的Alpha值清零,僅留下RGB部分。 如果整個數字為零,則每種顏色都必須為零,因此無需單獨檢查每種顏色。

最后的想法:

我沒有專門為Android做很多事情,但是0x000000黑色和0xFFFFFF白色不是嗎? 因此,您實際上是在這里匹配黑色而不是白色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM