Chiamare C ++ dll da Java

Sto usando Java per una piccola app. È una riscrittura di un progetto MFC esistente. C’è una DLL esistente che devo modificare per abilitare l’accesso da Java usando JNI. Tutta questa roba Java è nuova per me, quindi ho un po ‘di problemi e mi sento piuttosto denso quando leggo altri post sul forum. Nella dll esistente ho una funzione come questa:

extern "C" __declspec(dllexport) bool Create() { return TRUE; } 

Tempo di domande stupido. Come posso configurarlo correttamente per essere chiamato da Java?

Ho provato questo:

 JNIEXPORT jboolean JNICALL Create() { return TRUE; } 

Sto includendo jni.h e tutto va bene. Tuttavia, quando lo chiamo da Java ottengo UnsatisfiedLinkError. Lo sto chiamando da Java usando questo:

 public static native boolean CreateSession(); System.load("D:\\JavaCallTest.dll"); Create(); 

Qualcuno potrebbe gentilmente spingermi nella giusta direzione? Apprezzo sinceramente qualsiasi aiuto.

Grazie,

tacca

È necessario includere il nome e il percorso della class Java nel codice nativo, ad esempio se il metodo nativo è stato dichiarato in Java come:

 public class NativeCode { public static native boolean CreateSession(); } 

e il percorso della class era (ad esempio) com.example.NativeCode dichiareresti il ​​tuo metodo in nativo come segue:

 extern "C" JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz) { return JNI_TRUE; } 

Tutti i metodi JNI hanno un puntatore e una class JNIEnv come primi due parametri.

Un metodo nativo statico richiede ancora almeno due parametri:

 JNIEnv *env jclass clazz 

Il nome della funzione deve anche corrispondere alla struttura del pacchetto java.

 JNIEXPORT jboolean JNICALL Java_com_example_CreateSession(JNIEnv *env, jclass clazz) 

Idealmente, si utilizzerà lo strumento javah per creare un file di intestazione dalla class java che dichiara il metodo nativo e quindi implementare i prototipi di funzione dichiarati.

Ho avuto un problema simile – un C-Codebase esistente che avevo bisogno di accedere da Java. Ho pagato per me, per familiarizzare con SWIG , uno strumento per generare una DLL C ++ intermedia (che chiama il codice C), oltre a Java-Code che sta chiamando nella DLL C ++.

Se hai più di una sola funzione della DLL da avvolgere, potrebbe pagare per dare un’occhiata a questo strumento, altrimenti dovresti avere familiarità con JNI …

MODIFICA :

Sembra che la tua DLL non venga trovata dalla chiamata System.load() . Si potrebbe voler provare System.loadLibrary() , ma si noti che la DLL deve quindi trovarsi nel percorso indicato dalla proprietà di sistema Java java.library.path . Inoltre non passare il nome completo del file in questo caso, ma solo il nome del file senza estensione.