每个类在C代码(NDK)中为自己创建静态字段

时间:2016-03-01 13:31:56

标签: android c static android-ndk java-native-interface

我是C和NDK的新手,在我的应用中,我想保存并在不同文件之间共享一些数据。所以我制作了包含静态字段的.c文件。

当我在一个文件中使用它时效果很好,但是当我尝试在其他文件中使用它时,它没有我之前写过的数据。它看起来每个文件都在自己内部创建我的静态字段的新实例

修改

添加了.h文件。

代码test.h:

#ifndef IJKPLAYER_TEST_H
#define IJKPLAYER_TEST_H

void saveStartLoadingData();

int64_t getStartLoading();

void addToLoadingByte(int64_t bytesCount);

void endOfLoading();

void calculateAndSaveCurrentBitrate();

int64_t getDiff();

int64_t getLoadedBites();

int64_t getEndLoading();

int64_t getCurrentBitrate();

#endif //IJKPLAYER_TEST_H

test.c的:

#include "test.h"
#include <time.h>

static const int64_t ONE_SECOND= 1000000000LL;

extern int64_t start_loading;
extern int64_t end_loading ;
extern int64_t loaded_bytes;
extern int64_t currentBitrate;
extern int64_t diff;

int64_t now_ms() {
    struct timespec now;
    clock_gettime(CLOCK_MONOTONIC, &now);
    return (int64_t) now.tv_sec*1000000000LL + now.tv_nsec;
}

void saveStartLoadingData(){
    loaded_bytes = 0LL;
    start_loading =  now_ms();
}

int64_t getStartLoading(){
    return start_loading;
}

void addToLoadingByte(int64_t bytesCount){
    loaded_bytes += bytesCount;
}

void endOfLoading(){
    end_loading = now_ms();
    diff = end_loading - start_loading;
}

void calculateAndSaveCurrentBitrate(){
    currentBitrate = loaded_bytes * ONE_SECOND/ diff;
    loaded_bytes = 0;
}

int64_t getDiff(){
    return diff;
}
int64_t getLoadedBites(){
    return loaded_bytes;
}
int64_t getEndLoading(){
    return end_loading;
}
int64_t getCurrentBitrate(){
    return currentBitrate;
}

现在我以这种方式将其包含在其他文件中:

#include "test.h"

编辑2

新错误

libavformat/avio.c:430: error: undefined reference to 'getStartLoading'
libavformat/avio.c:431: error: undefined reference to 'getEndLoading'
libavformat/avio.c:432: error: undefined reference to 'getLoadedBites'

1 个答案:

答案 0 :(得分:1)

您只能被允许一次包含.c文件。

如果您需要在另一个.c或.cpp文件中使用该.c文件中的变量或函数,则必须创建.h文件并将其包含在需要变量的文件中。您可以根据需要在.c或.cpp文件中包含.h文件。

在.h文件中写:

extern int64_t start_loading;
void saveStartLoadingData();

从.c文件中删除所有static