■ 現象について
* JNIを使って、JavaからC++のモジュール(dll)をロードした際に以下のエラーが表示され、プログラムが中断される
* dllはちゃんと、指定した場所に存在し、32ビットOS環境下で32ビット用のdllである
■ 原因
* パッケージ名が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)