c - "error: ' xxx ' undeclared"_and_ "error: unused variable ' xxx '"同时在同一个文件中

标签 c java-native-interface

我有一个非常奇怪的 JNI 编译问题,完全不知道如何解决...

这是一个在我的 Java 代码中从静态上下文调用的函数:

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

private static native void initLog(final Logger logger);

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

声明该函数的头文件如下:

#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 文件:

#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’

呃...我完全目瞪口呆。这里发生了什么? :/我一定遗漏了一些非常明显的东西,我就是想不通是什么……

最佳答案

jmsgjsmg 是两个不同的东西。

关于c - "error: ' xxx ' undeclared"_and_ "error: unused variable ' xxx '"同时在同一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8630351/

相关文章:

java - 将 jstring 从 jni c 代码发送到接收字符串作为参数的 java 函数

java - 将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器

java - 如何使用 gcc 编译器或其他编译器生成 64 位 .dll。无法在 AMD 64 位平台上加载 IA 32 位 .dll

java - 如果使用 Jace JNI 进行多线程 native 调用,Tomcat 会崩溃

c++ - 在 C++ 中设置正在运行的应用程序的当前目录

c - Windows下C程序的内存使用情况

c - 缩进 C 代码,Unix

java - 包中包含 .java 文件的 Eclipse JNI

c - 如何使用(Scitools)的perl api在.c文件中查找特定字符串 了解?

C - 控制台窗口中的彩色字符 (Linux)