こんにちは、私は JNI の初心者で、Eclipse を使用して単純な JNI の例を動作させようとしています。次のチュートリアルの手順に従いました: http://codeandme.blogspot.com/2011/09/jni-made-easy.html 私の Java コードは次のとおりです。
public class Main
{
private native int getDouble(int n);
public static void main(String[] args)
{
System.load("/home/ryan/Desktop/libJNILibrary3.so");
Main m = new Main();
System.out.println(m.getDouble(3));
}
}
次に、jdk1.7.0_11/bin に含まれる javah ツールを使用して、ヘッダー ファイルを生成しました。
/* 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: getDouble
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Main_getDouble
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
次に、Eclipse で C++ プロジェクトを作成し、Main.cpp ソース ファイルを作成しました。Main.cpp と同じフォルダーに Main.h ファイルを配置しました。Main.cpp のコードは次のとおりです。
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_getDouble
(JNIEnv *env, jobject obj, jint n)
{
return n*2;
}
次に、プロジェクトのビルド設定を構成するためのチュートリアルの指示に従いました。プロジェクトをビルドすると、「.so」ファイル「libJNILibrary3.so」が作成されました。次に、Java クラス「Main」を実行したところ、次のエラーが発生しました。
Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.getDouble(I)I
at Main.getDouble(Native Method)
at Main.main(Main.java:9)
奇妙なことに、この例をやり直して、getDouble メソッドが引数を取らず、単に値 2 を返すようにすると、すべてが正常に機能します。メソッドに引数を取らせると、どういうわけかすべてが台無しになります。このエラーに 10 時間以上費やし、多くのフォーラムを検索しましたが、この問題の解決策は見つかりませんでした。どんな助けでも大歓迎です。ありがとう!