我正在开发一个java项目,我正在使用mediainfo库。 我在Windows中使用midiainfo.dll的JNA代码工作正常,但是当我在linux中运行我的代码时它无法正常工作并给出以下异常 -
java.lang.UnsatisfiedLinkError: Unable to load library 'MediaInfo': libMediaInfo.so: cannot open shared object file: No such file or directory
我写了这样的jave代码 -
interface MediaInfoDLL_Internal extends Library
{
MediaInfoDLL_Internal INSTANCE = (MediaInfoDLL_Internal) Native.loadLibrary("MediaInfo", MediaInfoDLL_Internal.class, singletonMap(OPTION_FUNCTION_MAPPER, new FunctionMapper()
{
public String getFunctionName(NativeLibrary lib, Method method)
{
// MediaInfo_New(), MediaInfo_Open() ...
return "MediaInfo_" + method.getName();
}
}
));
//Constructor/Destructor
Pointer New();
void Delete(Pointer Handle);
//File
int Open(Pointer Handle, WString file);
void Close(Pointer Handle);
//Infos
WString Inform(Pointer Handle);
WString Get(Pointer Handle, int StreamKind, int StreamNumber, WString parameter, int infoKind, int searchKind);
WString GetI(Pointer Handle, int StreamKind, int StreamNumber, int parameterIndex, int infoKind);
int Count_Get(Pointer Handle, int StreamKind, int StreamNumber);
//Options
WString Option(Pointer Handle, WString option, WString value);
}
并且只是通过在classpath中添加mediainfo.dll这就像魔术一样,但在linux中我试图添加libmediainfo.so.0,libmediainfo.so.0.0.0,libzen.so.0和libzen.so。 0.0.0但没有运气......
有人知道如何在linux中运行mediainfo + java吗?
我使用的是Java 6,CentOS 5.6最终和最新的mediainfo版本。
答案 0 :(得分:1)
我通过制作符号链接
解决了我的问题我使用了超级用户的以下命令
$ sudo ln -s /usr/lib/libmediainfo.so.0 /usr/lib/libMediaInfo.so
$ sudo ln -s /usr/lib/libzen.so.0 /usr/lib/libzen.so
答案 1 :(得分:1)
* nix上的文件名区分大小写,因此如果您的库名为libmediainfo.so
,则需要更改
Native.loadLibrary("MediaInfo",....
到
Native.loadLibrary("mediainfo",
答案 2 :(得分:1)
1)确保文件实际上名为“libMediaInfo.so”(区分大小写!);它可以是指向实际版本的符号链接,很多lib都是这样设置的。 2)确保此文件位于* nix上的LD_LIBRARY_PATH中3)在代码中使其小写可能会使它更清晰,但这是样式的问题 - 重要的是代码中的lib名称必须对应于文件名系统,包括案例