Jni DLL v Javě
Potřebuju napsat program v javě, který volá metody dllka.
1. Prográmek Lcoew32.java:
public class Lcoew32 {
public static native void LceGetSessionId();
static {
try {
System.loadLibrary("Lcoew32");
System.out.println("Dll bylo načteno");
}
catch (Exception e) {
System.out.println("Nepodařilo se načíst dll");
System.exit(-1);
}
}
/**
* @param args
*/
public static void main(String[] args) {
LceGetSessionId();
}
}
2. Přeložím ho pomocí javac.
3. Vygeneruju hlavičkový soubor LCOEW32.h pomocí javah:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Lcoew32 */
#ifndef _Included_Lcoew32
#define _Included_Lcoew32
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Lcoew32
* Method: LceGetSessionId
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Lcoew32_LceGetSessionId
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
4. Program LceGetSessionID.c:
#include <windows.h>
#include "LCOEW32.H"
#include <stdio.h>
JNIEXPORT void JNICALL Java_Lcoew32_LceGetSessionId(JNIEnv *env, jclass cls) {
printf("Sláááááva, funguje to!!!!");
return;
}
5. Zkompiluju Céčkový program.
6. Spustím java Lcoew32
Dll bylo načteno
Exception in thread "main" java.lang.UnsatisfiedLinkError: Lcoew32.LceGetSessionId<>V
at Lcoew32.LceGetSessionId<Native Method>
at Lcoew32.main<lcoew32.java:19>
Co s tím? Path mám nastavený na adresář s vytvořeným dll. Navíc počítám, že kdyby se dll nenačetlo, tak by to spadlo na výjimku a nevypsalo by mi to, že bylo načteno. Takže tady podle mne chyba asi nebude. Fakt nevím, co s tím
Tu classu Lcoew32 mas v nejakom inom packagi ako v defaultnom?
ak ano, header musis vygenerovat plnym menom:
Ještě mne napadlo - to Céčko kompiluju v Dev-C++ jako dll. Skutečně to vytvoří dll soubor. Nemá se ale ještě někde něco nastavit, aby to bylo nativní dll? Nebo čím jiným to co nejjednodušeji zkompilovat?
Sice už je trochu pozdě, ale třeba by se to někomu mohlo hodit. Při použití MingW jsem musel nastavit kompilátoru následující parametry "-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at". Dá se to zkontrolovat přímo v DLL-Souboru. Bez těchto parametrů tam bylo např: ..._initEasyData@8, až když jsem je přidal, tak @8 zmizelo a Java mi tu funkci initEasyData našla.