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’
ええと...私は完全に仰天しています。ここで何が起こっているのですか? :/私は非常に明白な何かを逃している必要があります、私はちょうど何を把握することはできません...
ああ... :(ありがとう:p – fge