Agar System.loadLibrary()
dapat berfungsi, pustaka (di Windows, DLL) harus berada di direktori di suatu tempat di Anda PATH
atau di jalur yang tercantum di java.library.path
properti sistem (sehingga Anda dapat meluncurkan seperti Java java -Djava.library.path=/path/to/dir
).
Selain itu, untuk loadLibrary()
, Anda menentukan nama dasar pustaka, tanpa .dll
akhiran. Jadi, untuk itu /path/to/something.dll
, Anda hanya akan menggunakan System.loadLibrary("something")
.
Anda juga perlu melihat persis apa UnsatisfiedLinkError
yang Anda peroleh. Jika tertulis sesuatu seperti:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
maka ia tidak dapat menemukan pustaka foo (foo.dll) di PATH
atau java.library.path
. Jika tertulis sesuatu seperti:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
maka ada yang salah dengan pustaka itu sendiri dalam arti bahwa Java tidak dapat memetakan fungsi Java asli dalam aplikasi Anda ke mitra aslinya yang sebenarnya.
Untuk memulainya, saya akan meletakkan beberapa logging di sekitar System.loadLibrary()
panggilan Anda untuk melihat apakah itu dijalankan dengan benar. Jika itu melontarkan pengecualian atau tidak dalam jalur kode yang benar-benar dieksekusi, maka Anda akan selalu mendapatkan jenis terakhir yang UnsatisfiedLinkError
dijelaskan di atas.
Sebagai catatan kecil, kebanyakan orang menempatkan loadLibrary()
panggilan mereka ke dalam blok penginisialisasi statis di kelas dengan metode asli, untuk memastikan bahwa itu selalu dieksekusi tepat sekali:
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}