JavaCpp:如何指定本机库?

时间:2015-02-01 22:16:02

标签: java java-native-interface g++ shared-libraries javacpp

JavaCpp在创建jni库libmynativelib.so时会在哪里查找本机库/linux-x86_64/libjnimynativelib.so

使用@Platform注释向JavaCpp讲述C ++标头和共享库,如下所示:

@Platform(include={"MyLibraryHeader.h"}, link = "mynativelib")
@Namespace("mynamespace")
public class MyLibrary {
  ...
}

然后编译上述Java类并通过JavaCpp运行,如下所示:

javac -cp javacpp.jar MyLibrary.java
java -jar javacpp.jar -cp ../..   # classpath is parent of com/mypackage dir

然后JavaCpp输出:

Generating /<projpath>/jniMyLibrary.cpp
Compiling /<projpath>/linux-x86_64/libjniMyLibrary.so
g++ -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux <path>/jniMyLibrary.cpp -Wl,-rpath,$ORIGIN/ -march=x86-64 -m64 -Wall -O3 -fPIC -shared -s -o /<projpath>/linux-x86_64/libjnimynativelibrary.so -lmynativelib

出现此错误:

/usr/bin/ld: cannot find -lmynativelib

g ++在当前的dir()或linux-x86_64子目录中找不到libmynativelib.so

LD_LIBRARY_PATH=<projdir>没有帮助。

告诉JavaCpp要加载哪个本机库的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

@Platform(link=)注释已指定要链接到的JavaCpp的本机库:

@Platform(include="MyLibraryHeader.h", link="mynativelib")

所以剩下的就是告诉g ++在哪里找到库libmynativelib.so。这是通过JavaCpp Xcompiler指令将-L参数发送到g ++来完成的:

java -jar javacpp.jar -cp ... Xcompiler -L<libdir>