これは少し前に機能していましたが、何が起こったのかよくわかりませんが、現在は機能していません。
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
legacy.c
#include "legacy.h"
double dSum(double x, double y) {
double result = x + y;
return result;
}
レガシー.h
double dSum(double x, double y);
このプログラムは、2 つの数値の合計を計算することになっています。簡単なこと。しかし、次のコマンドでプログラムの .dll を cygwin でコンパイルしようとすると、次のようになります。
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 行に分割されていますが、実際には 1 行です。見栄えを良くするために分割しています)
このコマンドが数日前に完全に機能していたことをお伝えしなければなりません。何が起こったのかわかりませんが、送信後、次のエラーが表示されます。
/tmp/ccOvXYYS.o:NativeMethods.c:(.text+0x14): undefined reference to `_dSum'
collect2: ld returned 1 exit status
何が問題なのか、なぜこのエラーが発生するのか本当にわかりません。