2

libmynativelib.soJavaCppは、jni ライブラリを作成するときにネイティブ ライブラリをどこで検索し/linux-x86_64/libjnimynativelib.soますか?

JavaCpp は、次の@Platformような注釈を使用して 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++ はlibmynativelib.so、現在のディレクトリ () または linux-x86_64 サブディレクトリのいずれにも見つかりません。

LD_LIBRARY_PATH=<projdir>役に立ちません。

どのネイティブ ライブラリをロードするかを JavaCpp に伝えるための推奨される方法は何ですか?

4

1 に答える 1

1

@Platform(link=)注釈は、JavaCpp がリンクするネイティブ ライブラリを既に指定しています。

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

あとは g++ にライブラリの場所を伝えるだけですlibmynativelib.so。これは、JavaCppXcompilerディレクティブを介して -L パラメーターを g++ に送信することによって行われます。

java -jar javacpp.jar -cp ... Xcompiler -L<libdir>
于 2015-02-04T02:23:15.207 に答える