JNI- damnPackages!

Status
Nicht offen für weitere Antworten.

[RTB]H3r0

Mitglied
jo.

also. ich muss mal
thE_29
danken.

nun, vielleicht gibts ja noch andere jni-begabte da drausen...
jetzt habe ich das Problem, wenn ich meine Klasse, die eine nativ-Funktion nutzt in ein Package stecke.
kommt es dann zu diesem funktionsaufruf, dann kommt 'UnbefriedigenderVerbndungsFehler'

das ist mein d:\dev\app\tester.java

Code:
package app;
import app.winapi.*;
class tester{
    public static void main(String args[]){
        System.out.println("run...");
        MessageBox myMsgBox=new MessageBox("Exception");
     }
}

das ist die d:\dev\app\winapi\MessageBox.java
Code:
package app.winapi;
/****
/ Diese Klasse stellt eine MessageBox zur Verfügung.
/ Ein Objekt dieser Klasse erstellt man mit
/  a) MessageBox(title,text,style);
/  b) MessageBox(fehlermeldung);
/
/ text bzw. fehlermeldung repräsentieren den text, der im Fenster
/ dargestellt wird.
/ den Zurückgegebenen Wert erfährt man mit getLastRetValue();
/ An Stelle der WINAPI muss dies Klase auch noch mit AWT realisiert werden.
/ (aber genau disen Schritt möchte ich sparen)
*/
public class MessageBox{

  private native int WINMessageBox(String title, String text, int typ);

  public static final int mbsO=0;
  public static final int mbsOA=1;
  public static final int mbsAWI=2;
  public static final int mbsJNA=3;
  public static final int mbsJN=4;
  public static final int mbsWA=5;
  public static final int mbsAWW=6;
  public static final int mbsException=16;
  public static final int mbsQuestion=32;
  public static final int mbsAttention=48;
  public static final int mbsInfo=64;
  public static final int mbrOk=1;
  public static final int mbrAbbrechen=2;
  public static final int mbrWieder=4;
  public static final int mbrIgnor=5;
  public static final int mbrJa=6;
  public static final int mbrNein=7;
  public static final int mbrWeiter=11;

  private static int lastRetValue;
    public static int getLastRetValue(){return lastRetValue;}
    
  static{
    Runtime.getRuntime().load("d:\\dev\\app\\jMsg.dll");
  }

  private int retValue;
    public int getRetValue(){return retValue;}


  public MessageBox(String title, String text, int typ){
   retValue= (int) WINMessageBox(title, text, typ);
   lastRetValue=retValue;
 }

public MessageBox(String fehlerText){
  new MessageBox("FEHLER",fehlerText,16);
 }
public static void main(String args[]){
  MessageBox myMsg=new MessageBox("TOLL");
}
}
//nicht über die FINALS WUNDERN!!

wenn ich die package Zeilen (und die Import zeile) auskommentiere, klapt es alles bestens!
(obwohl doch beide datein in einem anderen verzeichnis leigen....)

ich habe gelesen das in dem .h file ein 'vollständigQuallifizierenderName' angegeben werden soll.
muss ich also von Hand den packagename einfügen?
javah -jni erstellt die funktionsdefinitionen OHNE packagenamen.
hatte einer schonmal das problem? (außer the_29)
und wie hat ers gelöst.

zur laden von dll's kann ich euch nur
Code:
Runtime.getRuntime().load("path\\name.dll");
empfehlen. dann hat man das Probelm mit der System.library.path-exception nicht.

das mit den Packages stresst echt. und ohne ist es so... unsauber
 

thE_29

Top Contributor
Es gibt 2 Lösungen!

Entweder du schreibst überall dein Package hardcore selber rein (in die .h und .cpp Datei)

Einfach bei Java_app_winapi_MessageBox_WINMessageBox

Glaub so müßte es aussehen! (und überall sonst noch wo der Pfad steht!!)

Oder du stellst dich ins root Verzeichnis (dann muessen die Dateien auch in den Ordner sein, wie sie im Package definiert sind). Und machst dort javah -classpath ./dein/package/deinklasse


Würde zum 2teren raten und hier noch ein Link

http://forum.java.sun.com/thread.jspa?forumID=52&messageID=2412131&threadID=476416
 

[RTB]H3r0

Mitglied
ich hab das HARDCORE gemacht.

deine syntax ist auch korrect.
Java_app_winapi_MessageBox_WINMessageBox

thx.
(dabei hab ich das schon vor dem lesen hier rausbekommen)

wenn ich javah mit deier 'konfiguration' starte, macht er das selber, oder wie??
is eigentlich egal. funzt ja,.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben