JNI Bonjour tout le Monde Insatisfait Erreur de Lien
C'est ma première tentative à la JNI. Mon but ultime est d'obtenir toutes les tâches en cours d'exécution sur une machine, mais qui ont besoin d'obtenir même un exemple simple exécutant. Je reçois ce message d'erreur lorsque j'essaie d'exécuter mon programme principal. J'ai fourni mon Java simple programme principal, le fichier d'en-tête généré, et l'erreur.
Je ne sais pas ce que cette DLL peut dépendre de l'. Il a d'abord été le référencement d'une DLL, je traqué et mis dans system32 (msvcr90.dll).
Voici la commande que j'ai utilisé pour compiler le code C ainsi que s'est produite la DLL, OBJ, LIB, EXP et les fichiers manifeste.
cl -I"C:\Program Files\Java\jdk1.6.0\include" -I"C:\Program Files\Java\jdk1.6.0\include\win32" -MD-LD HelloWorld.c -FeHelloWorld.dll
class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.load("C:\\temp\\HelloWorld.dll");
}
}
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
java.lang.UnsatisfiedLinkError: C:\temp\HelloWorld.dll: A dynamic link library (DLL) initialization routine failed
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at HelloWorld.<clinit>(HelloWorld.java:7)
Exception in thread "main"
Ce que les "insatisfaits erreur de lien'? Où est le texte de l'erreur? Il y a au moins trois possibilités différentes avec trois solutions différentes.
OriginalL'auteur Ken | 2009-08-31
Vous devez vous connecter pour publier un commentaire.
Insatisfaits Erreur de Lien peut signifier beaucoup de choses se sont mal passées. Je voudrais utiliser
Au lieu de
Comme TwentyMiles suggéré.
Aussi, lors de l'invocation de votre programme, vous devez (en supposant que votre fichier DLL est sur le même répertoire que vos fichiers de classe:
java -Djava.de la bibliothèque.path=. HelloWorld
Voici une simple démo que j'ai faite qui appelle une fonction API Win32 (MessageBox)
Classe Java
Généré fichier d'en-tête
La DLL C code
De la compilation des instructions
Je compile avec Visual C++ express 2008 cl, le retrait de la ML drapeau car elle provoque une exception lorsque le code Java tente d'appeler le code natif:
cl /I"c:\Program Files\Java\jdk1.6.0_10\include" /I"c:\Program Files\Java\jdk1.6.0_10\include\win32" -LD CallApi.c -FeCallApi.dll
Ensuite, pour exécuter le code:
java -Djava.de la bibliothèque.path=. CallApi
java -classpath . CallApi
au lieu dejava -Djava.library.path=. CallApi
. Son travail uniquement pour les 1er et pas pour ce que vous avez donné... Y? Est-ce donc?OriginalL'auteur Cesar
Je ne prétends pas comprendre la situation assez pour expliquer cela, cependant, certains utilisateurs ont signalé l'erreur lors de l'utilisation de la "MÉDECINE" du compilateur drapeau.
Pour plus d'informations, voir
Java Native Interface (JNI) - Impossible d'utiliser VS2005 avec Java?qui traite de ce problème et propose de contournement possible et pensez technophile blog pour des solutions de rechange.Le lien pour "Java Native Interface (JNI) - Impossible d'utiliser VS2005 avec Java?" est cassé.
Merci d'avoir signalé le lien brisé. Malheureusement, je ne pouvais pas mettre à jour la référence.
Je crois que la page à l'origine référencé dans la réponse de Bruno Simões, peuvent être trouvées ici: "Fil de discussion: Impossible d'utiliser VS2005 avec Java?" forums.oracle.com/forums/thread.jspa?threadID=1547791 HTH!
OriginalL'auteur Bruno Simões
Je crois que vous devriez être en utilisant
au lieu de Système.de la charge. LoadLibrary va vérifier le chemin d'accès système (pas le Java chemin de la bibliothèque) donc, assurez-vous que HelloWorld.dll est dans un répertoire où il peut trouver. Notez également qu'il ne nécessite pas le chemin d'accès complet, et vous n'avez pas besoin d'ajouter la dll d'extension à la fin.
OriginalL'auteur TwentyMiles
J'ai juste enlevé -MD option et compilé, il a travaillé comme un charme
OriginalL'auteur sreekanth