这在前一段时间有效,我真的不知道发生了什么,但现在它不再有效了。
这是一个使用 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
我真的不知道出了什么问题以及为什么会收到此错误。