【トラブル】JNIで、エラー「java.lang.UnsatisfiedLinkError」が表示され、プログラムが動かない

■ 現象について

 * JNIを使って、JavaからC++のモジュール(dll)をロードした際に以下のエラーが表示され、プログラムが中断される
 * dllはちゃんと、指定した場所に存在し、32ビットOS環境下で32ビット用のdllである

■ エラー内容

Exception in thread ”main” java.lang.UnsatisfiedLinkError: Xxxxx

エラーの意味

http://docs.oracle.com/javase/jp/7/api/java/lang/UnsatisfiedLinkError.html
より、抜粋

nativeと宣言されたメソッドの適切なネイティブ言語の定義を、Java VMが見つけることができない場合にスローされます。

■ 原因

 * パッケージ名がC++側とJava側で一致していなかった

  => C++側のヘッダーで、"Java_パッケージ名_クラス名_メソッド名"の場合
     Java側もその通り、「パッケージ名.クラス名.メソッド名」にしなければならないのだが
     そうなっていなかった

http://blogs.yahoo.co.jp/dk521123/33062191.html
のソースを例にするなら、

【C++】-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// "Java_パッケージ名(com_jni)_クラス名(JniSample)_メソッド名(getHellow)"
JNIEXPORT jstring JNICALL Java_com_jni_JniSample_getHellow
  (JNIEnv *, jobject, jstring);
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Java(誤り)
// ★ここが誤り(sampleじゃない)★
package com.sample;

public class JniSample { // クラス名(JniSample) 
   public native String getHellow(String name); // メソッド名(getHellow)
Java(正しい)
//  以下のようにしたら例外が発生しなくなった

// パッケージ名(com_jni)
package com.jni;

public class JniSample { // クラス名(JniSample) 
   public native String getHellow(String name); // メソッド名(getHellow)


関連記事

JNIを使って、C++ から Java のソースを呼び出す (C++ => Java)

http://blogs.yahoo.co.jp/dk521123/33067170.html

NIを使って、Java から C++ のソースを呼び出す (Java=>C++)

http://blogs.yahoo.co.jp/dk521123/33062191.html