2011-12-25 4 views
0

JNIで本当に変わったコンパイルの問題があります。"エラー: 'xxx'未宣言の" _and_ "エラー:未使用の変数 'xxx'"が同じファイル内に同時に表示される

#ifndef __LOG__H__ 
#define __LOG__H__ 

#include <jni.h> 

JNIEXPORT void JNICALL Java_org_eel_kitchen_pam_PamHandle_initLog(JNIEnv *env, 
    jclass cls, jobject jlogger); 

struct javaLogger { 
    jobject logger; 
    jmethodID debugID; 
    void (*debug)(JNIEnv *env, struct javaLogger *logger, char *msg); 
}; 

extern struct javaLogger logger; 

void debug(JNIEnv *env, struct javaLogger *logger, char *msg); 

#endif /* __LOG_H__ */ 

、これはCで次のようにこの関数を宣言ヘッダである

private static final Logger logger 
    = LoggerFactory.getLogger(PamHandle.class); 

private static native void initLog(final Logger logger); 

static { 
    System.loadLibrary("pam4j"); 
    initLog(logger); 
} 

...

これは私のJavaコードで静的コンテキストから呼び出される関数です。ファイル:

#include "log.h" 

struct javaLogger logger; 

JNIEXPORT void JNICALL Java_org_eel_kitchen_pam_PamHandle_initLog(JNIEnv *env, 
    jclass cls, jobject jlogger) 
{ 
    jclass class = (*env)->GetObjectClass(env, jlogger); 

    logger.logger = jlogger; 
    logger.debugID = (*env)->GetMethodID(env, class, "debug", 
     "(Ljava/lang/String;)V"); 
    logger.debug = debug; 
} 

void debug(JNIEnv *env, struct javaLogger *logger, char *msg) 
{ 
    jstring jsmg = (*env)->NewStringUTF(env, (const char *)msg); 

    if (jmsg) 
     (*env)->CallVoidMethod(env, logger->logger, logger->debugID, jmsg); 
} 

しかし、私は(gcc -c -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -fPIC -g -c -I$JAVA_HOME/include -I$JAVA_HOME/include/linux log.cで)それをコンパイルしようとすると、これは私が手に出力されます:

log.c: In function ‘debug’: 
log.c:20:9: error: ‘jmsg’ undeclared (first use in this function) 
log.c:20:9: note: each undeclared identifier is reported only once for each function it appears in 
cc1: warnings being treated as errors 
log.c:18:13: error: unused variable ‘jsmg’ 

ええと...私は完全に仰天しています。ここで何が起こっているのですか? :/私は非常に明白な何かを逃している必要があります、私はちょうど何を把握することはできません...

答えて

4

jmsgjsmgは2つのものです。

+2

ああ... :(ありがとう:p – fge