0

这在前一段时间有效,我真的不知道发生了什么,但现在它不再有效了。

这是一个使用 JNI 的简单基本程序。
它有6个类:

主JNI

public class MainJNI {
    static {
        System.loadLibrary("W36Lib");
    }

    public static void main(String[] args) {
        double x = 7.0;
        double y =2.0;
        double sumResult = NativeMethods.sum(x, y);

        System.out.println("Sum = " + sumResult);
    }
}

NativeMethods.java

public class NativeMethods {
    public static native double sum(double x, double y);
}

NativeMethods.c

#include "NativeMethods.h"
#include "legacy.h"
#include <stdio.h>

JNIEXPORT jdouble JNICALL Java_NativeMethods_sum
    (JNIEnv *env, jclass cls, jdouble x, jdouble y) {
    return dSum(x, y);
}

NativeMethods.h - 通过命令“javah NativeMethods”使用 cygwin 生成

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeMethods */

#ifndef _Included_NativeMethods
#define _Included_NativeMethods
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeMethods
 * Method:    sum
 * Signature: (DD)D
 */
JNIEXPORT jdouble JNICALL Java_NativeMethods_sum
  (JNIEnv *, jclass, jdouble, jdouble);

#ifdef __cplusplus
}
#endif
#endif

遗留.c

#include "legacy.h"

double dSum(double x, double y) {
    double result = x + y;
    return result;
}

遗留.h

double dSum(double x, double y);

该程序应该计算 2 个数字的总和。一件容易的事。但是当我尝试通过以下命令在 cygwin 中编译程序的 .dll 时:

    gcc -Wl,--add-stdcall-alias -mno-cygwin -shared 
-I"/cygdrive/c/jdk1.7.0_09/include" 
-I"/cygdrive/c/jdk1.7.0_09/include/win32" -o W36Lib.dll NativeMethods.c

(命令被分成 3 行,但实际上是一行。它被拆分只是为了在这里看起来不错)

我现在必须告诉你,这个命令在几天前运行良好。我不知道发生了什么,但是在发送之后,我收到了这个错误:

/tmp/ccOvXYYS.o:NativeMethods.c:(.text+0x14): undefined reference to `_dSum'
collect2: ld returned 1 exit status

我真的不知道出了什么问题以及为什么会收到此错误。

4

1 回答 1

2

您忘记包含legacy.c在编译中:

gcc -Wl,--add-stdcall-alias -mno-cygwin -shared 
-I"/cygdrive/c/jdk1.7.0_09/include" 
-I"/cygdrive/c/jdk1.7.0_09/include/win32" -o W36Lib.dll NativeMethods.c legacy.c
于 2012-12-24T19:53:54.373 回答