为使用fftw3的Java创建本机库

时间:2014-02-14 10:34:41

标签: java c++ fftw java-native-interface

我想调用一个使用java中的cpp的本地fftw3库。我的java类如下:

/* FourierGui.java */
public class FourierGui {
    native void fourierFromC();
    static {
        System.loadLibrary("fourier");
    }
    static public void main(String argv[]) {
        FourierGui ft = new FourierGui();
        ft.fourierFromC();
    }
}

我的cpp库是

/* fourier.cpp */

#include <jni.h>
#include <stdio.h>
#include <cmath>
#include <complex>
#include "fftw3.h"
#include <stdlib.h>

using namespace std;

JNIEXPORT void JNICALL Java_FourierGui_fourierFromC (JNIEnv * env, jobject jobj) {

    // something that uses fftw3

}

我创建了lybrary:

g++ -o libfourier.so -shared fourier.cpp -lc

但是当我用

运行java类时
java -Djava.library.path="/path/to/lib/" FourierGui

我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/red/Scrivania/JNI/libfourier.so: /path/to/lib/libfourier.so: undefined symbol: fftw_plan_dft_1d
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at FourierGui.<clinit>(FourierGui.java:10)

我还尝试在libfftw3.so中添加java.library.path的路径,但我得到了相同的错误。它似乎无法找到最后一个库..(如果我自己编译并运行cpp代码,它没有错误......)

我知道有fftw3的java包装器,但我想自己做这个

1 个答案:

答案 0 :(得分:0)

我明白了......编译fftw3文件时,我必须链接cpp库:

g++ -o libfourier.so -shared fourier.cpp -lc -lfftw3