L'appel de C++ dll à partir de Java
Je suis à l'aide de Java pour une petite application. C'est une réécriture d'un projet MFC. Il existe une dll que j'ai besoin de changer afin de permettre l'accès de Java à l'aide de JNI. Tout cela nouveautés de Java est nouveau pour moi, donc je vais avoir un peu de mal et de sentiment, plutôt dense lorsque j'ai lu d'autres posts sur le forum. Dans la dll existante, j'ai une fonction comme ceci:
extern "C" __declspec(dllexport) bool Create()
{
return TRUE;
}
Question stupide temps. Comment puis-je correctement configuré pour être appelé par Java?
J'ai essayé ceci:
JNIEXPORT jboolean JNICALL Create()
{
return TRUE;
}
Je suis, y compris jni.h et tout compile bien. Cependant, quand je l'appelle à partir de Java-je obtenir UnsatisfiedLinkError. Je suis l'appeler à partir de Java à l'aide de ceci:
public static native boolean CreateSession();
System.load("D:\\JavaCallTest.dll");
Create();
Quelqu'un pourrait gentiment me pousser dans la bonne direction? Je suis sincèrement reconnaissant de toute aide.
Merci,
Nick
Alternativement, vous pouvez utiliser la JNA à la place de la JNI puisque vous avez une dll C qui peut être chargé par la JNA.
Merci de poster l'exception est levée...
Utilisation javah pour générer les en-têtes C, Jörn Horstmann mentionne ci-dessous-ou d'éviter la JNI entièrement. Une solution facile est JNA.
Merci pour l'aide. J'avais pensé à utiliser la JNA, mais je veux garder tous les extras à un minimum, donc j'ai pensé que je ferais mieux d'utiliser JNI.
OriginalL'auteur nickfinity | 2012-02-28
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure le nom de la classe Java et le chemin d'accès à votre code natif, par exemple, si votre méthode native a été déclarée en Java:
et le chemin de classe a (par exemple)
com.example.NativeCode
vous pouvez déclarer votre méthode en natif comme suit:Tous JNI méthodes ont un JNIEnv pointeur de classe et que leurs deux premiers paramètres.
quid des paramètres utilisés public static boolean natif CreateSession(?,?);
les paramètres sont ajoutés sur les paramètres dans le C méthode par exemple:
public static native boolean CreateSession(boolean, Object);
seraitJNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz, jboolean b, jobject o)
OriginalL'auteur GooseSerbus
Statique méthode native encore besoin d'au moins deux paramètres:
Le nom de la fonction doit également correspondre à l'package java structure.
Idéalement, vous devez utiliser la
javah
outil pour créer un fichier d'en-tête de la classe java déclarer la méthode native, puis de mettre en œuvre la déclaration de prototypes de fonction.Trouvé ce (stackoverflow.com/a/3452258/978528) et de configuration d'Eclipse pour exécuter javah. Fonctionne bien maintenant. Maintenant, je dois mettre en œuvre le reste de la substance. J'espère qu'il va être simple.
OriginalL'auteur Jörn Horstmann
J'ai eu un problème similaire - une C existant à base de Code que j'ai eu besoin d'accéder à partir de Java. Il a payé pour moi, de se familiariser avec SWIG, un outil pour générer un intermédiaire DLL C++ (qui appelle le Code-C), en plus de Java-Code qui est l'appel à la DLL C++.
Si vous avez plus que 1 de la fonction de la DLL retour à la ligne, ça peut être de vérifier cet outil, sinon vous auriez à se familiariser avec JNI...
MODIFIER:
Il semble que votre fichier DLL n'est pas trouvé par le
System.load()
appel. Vous voudrez peut-être essayerSystem.loadLibrary()
, mais notez que votre DLL doit être stocké dans le chemin indiqué par la propriété système Javajava.library.path
.Aussi ne pas passer le nom de fichier, dans ce cas, mais juste le nom du fichier sans l'extension.
OriginalL'auteur quaylar