私はC++ライブラリxyzを持っています。 xyzA
,xyzB
など多くのクラスがあります。xyzライブラリにあるxyzA
クラスのメソッドgetAge()
を使いたいと思います。JNIを使用してC++ライブラリから特定のクラスのメソッドを読み込む
xyz.so
ファイルは既に存在します。 Javaクラスのヘッダーを作成し
- Javaクラスを作成し
xyz.java
class xyz { public native int getAge(); public static void main(String[] args) { new xyz().getAge(); } static { System.loadLibrary("xyz"); } }
を:私は続いている
手順。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class xyz */ #ifndef _Included_xyz #define _Included_xyz #ifdef __cplusplus extern "C" { #endif /* * Class: xyz * Method: getAge * Signature:()I */ JNIEXPORT jint JNICALL Java_xyz_getAge (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
CPPラッパークラスは次のようになります。次のように
#include <stdio.h> #include "xyz.h" #include <jni.h> JNIEXPORT jint JNICALL Java_xyz_getAge(JNIEnv *, jobject) { // some code }
私は正常にクラスをコンパイル:
:java -Djava.library.path=/grid/0/tmp/direct/lib xyz
gcc -fPIC -shared -l stdc++ -I/grid/0/gs/java/jdk64/current/include -I/grid/0/gs/java/jdk64/current/include/linux xyz.cpp
次にとしてのJava PROGを実行します
は、私は次のエラーを取得する:
Exception in thread "main" java.lang.UnsatisfiedLinkError: xyz.getAge()I at xyz.getAge(Native Method) at xyz.main(xyz.java:6)
それはクラスxyzA
に固有の方法getAge()
を見つけることができません。そのメソッドにはどのようにアクセスできますか?また、ライブラリはラッパークラスを介してリンクされていますか?
何か指摘していただければ幸いです。
ありがとうございました。
もう1つの方法は、 'System.load(String)'を使用し、フルパスとファイル名を指定する方法です。しかし、共有ライブラリ命名のためのプラットフォーム規約に従うことは、今でも良い考えです。 –
'strace'は、jvmがロードしようとしているものを見つけるのに便利です。 – msandiford