我想编写一个简单的JNI的包装使用节文本到语音(或任何其它),其中有一个C++ API库。我有以下文件:JNI包装的C++库和未定义的符号错误
Main.java:
public class Main {
static {
System.loadLibrary("TTSWrapper");
}
private native void FestivalSayHello();
public static void main(String[] args) {
new Main().FestivalSayHello();
}
}
生成Main.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */
#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Main
* Method: FestivalSayHello
* Signature:()V
*/
JNIEXPORT void JNICALL Java_Main_FestivalSayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
FestivalWrapper.cpp:
#include <iostream>
#include <jni.h>
#include "Main.h"
#include "include/festival.h"
JNIEXPORT void JNICALL Java_Main_FestivalSayHello(JNIEnv *env, jobject thisObj) {
EST_Wave wave;
int heap_size = 210000; // default scheme heap size
int load_init_files = 1; // we want the festival init files loaded
festival_initialize(load_init_files,heap_size);
festival_say_file("/etc/motd");
festival_eval_command("(voice_ked_diphone)");
festival_say_text("hello world");
festival_text_to_wave("hello world",wave);
wave.save("output.wav","riff");
festival_wait_for_spooler();
return;
}
生成文件:发生在运行时
CLASS_PATH = ../bin
all : libTTSWrapper.so
libTTSWrapper.so : FestivalWrapper.o Main.h
g++ -m64 -fPIC -shared -o [email protected] $<
FestivalWrapper.o : FestivalWrapper.cpp Main.h
g++ -fPIC \
-I"/usr/lib/jvm/java-7-openjdk-amd64/include" \
-I"/home/TTS_tools/Festival/festival/src" \
-I"/home/TTS_tools/Festival/speech_tools/include" \
-L"/home/TTS_tools/Festival/festival/src/lib" \
-L"/home/TTS_tools/Festival/speech_tools/lib" \
-lFestival \
-lestools \
-lestbase \
-leststring \
-lncurses \
-c $< \
-o [email protected]
Main.h : Main.class
javah -classpath $(CLASS_PATH) $*
以下错误:
/usr/lib/jvm/java-7-openjdk-amd64/bin/java: symbol lookup error: /home/workspace/TTS/jni/libTTSWrapper.so: undefined symbol: _ZN8EST_WaveC1Ev
能否请你帮我搞清楚问题出在哪里?我不确定-m64和-fPIC是否必要。
注-1:nm libTTSWrapper.so | grep EST_Wave
列出了导致错误的符号,即使我删除了-L和-l行。
注-2:节日是静态库的组合。
注意3:这个问题不是库特定的,我也遇到了与另一个库(Ekho)相同的问题。问题是我不知道如何链接第三方库。
更新:我仍然不确定,但我想这个问题是因为节日没有链接-fPIC
选项。虽然符号出现在生成的共享库中,但我认为它们不能被正确引用。我达到了这个,而我试图让使用它链接到静态库的共享库的简单可执行,纯C.我必须要创建从-fPIC
选项生成目标文件中的.A文件,并且还共享库也需要-fPIC
选项。
问题是太特定的外部图书馆..你需要提供代码..什么是错误?代码是否导致它?它只是你的生成文件,无法找到文件?等等。仅仅makefile就不够好。 – Brandon 2014-10-30 19:08:56
确切的错误总是相关的 – Eric 2014-10-31 07:21:15
@Brandon:我编辑了这个问题,并添加了源代码。 – groove 2014-10-31 07:23:13