Ticket #12354

NoClassDefFoundError in JNI_OnLoad()
Eröffnet am: 2008-04-15 12:34 Letztes Update: 2008-04-24 22:48

Auswertung:
Verantwortlicher:
Typ:
Status:
Geschlossen
Komponente:
Meilenstein:
(Keine)
Priorität:
5 - Mittel
Schweregrad:
5 - Mittel
Lösung:
Gefixt
Datei:
Keine

Details

以下のケースでJNI_OnLoad()内でのFindClass()に失敗します。

1.Baseクラスを継承したConcreteクラスのstaticイニシャラ
イザでJNIをロードする。
2.ロードされたJNIのJNI_OnLoad()内でBaseクラスを
FindClass()で取得する。

/* Base abstract class */
abstract class Base {
protected volatile long handle;
}

/* Concrete class */
public class Concrete extends Base {
static {
System.loadLibrary("example");
}
}

/* example.c */
JNIEXPORT jint JNICALL JNI_OnLoad
(JavaVM *vm, void *reserved)
{
JNIEnv *env;
jint ret = (*vm)->GetEnv(vm, (void **)&env,
JNI_VERSION_1_2);
if (ret == JNI_OK)
{
jclass base = (*env)->FindClass(env, "Base");
if (base)
{
jfieldID handle
= (*env)->GetFieldID(env, base,
"handle", "J");
if (handle)
{
return JNI_VERSION_1_2;
}
}
}
return JNI_ERR;
}

ちなみにSunのjdk1.5.0_15ではエラーになりません。

Ticket-Verlauf (3/4 Historien)

2008-04-17 08:10 Aktualisiert von: freebeans
  • Verantwortlicher Update from (Keine) to freebeans
  • Lösung Update from Keine to Accepted
2008-04-17 20:26 Aktualisiert von: freebeans
Kommentar
Logged In: YES
user_id=14530

GetEnv()経由で呼び出されたJNIEnvのクラスローダは、ブートスト
ラップクラスローダになっているため、このような問題が発生して
いるようです。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/jni
/jni-12.html#FindClass
には「ClassLoader.getBaseClassLoader() の戻り値を使用する」
とありますので、そのように修正します。(上記記述は
ClassLoader.getSystemClassLoader()の誤りだと思います)
2008-04-18 22:51 Aktualisiert von: freebeans
  • Lösung Update from Accepted to Gefixt
Kommentar
Logged In: YES
user_id=14530

JNI_OnLoad()から呼び出された場合のみ特別扱いするように修正し
ました。
2008-04-24 22:48 Aktualisiert von: freebeans
  • Ticket Close date is changed to 2008-04-24 22:48
  • Status Update from Offen to Geschlossen
Kommentar
Logged In: YES
user_id=14530

修正を行ったモジュール Version 0.3.7 をリリースしました。

Dateianhangliste

Keine Anhänge

Bearbeiten

Please login to add comment to this ticket » Anmelden