2011-03-23 2 views
0

J'écris une applet Java qui charge les DLL créées en C++ non géré. J'écris un test de base pour le charger.Applet Java, problème de chargement de la DLL native

Voici le code:

La DLL:

#define DllExport _declspec(dllexport) 
DllExport int calc(); 


DllExport int calc() { 
return 1000; 
} 

L'applet:

import java.applet.*; 
import java.awt.*; 


public class app extends Applet { 

    int width, height; 
    private native int calc(); 

    public void init() { 
    try { 
     System.loadLibrary("appletdll.dll"); 
     setBackground(Color.black); 
    } 
    catch(Exception e) { 
     setBackground(Color.red); 
       // for debugging, is there another way to for example print 
       // exception messages in an applet? 
    } 

    //width = getSize().width; 
    width = calc(); 
    height = getSize().height; 
    } 

    public void paint(Graphics g) { 
    g.setColor(Color.green); 
    for (int i = 0; i < 10; ++i) { 
     g.drawLine(width, height, i * width/10, 0); 
    } 
    } 
} 

Le code HTML exécutant l'applet:

<html> 
<head><title>simple page</title></head> 
<body> 

<applet width=400 height=400 code="app.class" archive="apptest.jar"> </applet> 

</body> 
</html> 

Tout ce que je reçois quand courir dans Firefox est un blac Fond de 400x400 k. Lors de l'exécution dans applerviewer, j'obtiens un UnsatisfiedLinkError sur calc().

Le .jar a été signé avec ce guide: http://wiki.plexinfo.net/index.php?title=How_to_sign_JAR_files

Dans le dossier que j'ai: app.class, apptest.jar, appletdll.dll, applet.htm,
myKeystore

Je fais probablement beaucoup de mal, j'essaie juste de faire fonctionner quelques bases. J'ai regardé les guides applet + dll mais ils sont pour la plupart dépassés. S'il y a quelque chose qui n'est pas clair, il suffit de demander.

Merci

Répondre

0

D'abord, la fonction doit être appelée Java_app_calc(). Deuxièmement, il devrait prendre un seul argument de type "JNIEnv *". Ça devrait le faire. Si vous exécutez le programme "javah", il peut générer votre fichier d'en-tête C/C++, ce qui vous aidera à corriger les noms et les signatures des fonctions. L'argument est le nom d'une classe (il fonctionne sur les fichiers de classe compilés:

javah app

+0

Quelle fonction voulez-vous dire, si la fonction dans le dll ou dans le java renommé Qu'en est-il le JNIEnv argument * – KaiserJohaan

+2

@KaiserJohaan Vous semblez manquer les fondamentaux de JNI, je voudrais google pour un tutoriel ou parcourir celui-ci avant même de commencer http://download.oracle.com/javase/1.5.0/docs Le JNIEnv * est fourni par JVM et contient tout ce dont vous avez besoin pour interagir avec Java à partir du code natif.Après avoir écrit des milliers de lignes de code JNI, je suggère également d'évaluer les alternatives ... Ce n'est pas très amusant et il est très facile de faire des erreurs – Fredrik

+0

La fonction C devrait avoir ce nom - c'est le nom que recherche la JVM. Comme le dit @KaiserJohaan, l'argument est fourni par la JVM lorsqu'elle invoque votre méthode native. –

Questions connexes