Zum Inhalt springen

Java über JNI zum C


Zonbléou

Empfohlene Beiträge

Guten morgen,

ich habe noch eine Frage und die letzte wahrscheinlich. Beim Aufrufen von methoden in meiner Wrapper, geht's um die die Methoden im Header oder die im C-DLL. Es gibt einen kleinen Unterschied zwischen beiden. Die im C-DLL sind mit einem "_" vorangestellt und die im Header nicht. Kann man eigentlich prüfen, ob die Methoden gefunden sind oder nicht? In meiner Implementierung gibt eine Warnung, dass der Parameter im aufzurufende Mthode nicht benutzt ist, z.B: pFunc(input64), dass input64 nicht benutzt ist.

Vielen Dank für die letzte Rettungsaktion.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann man eigentlich prüfen, ob die Methoden gefunden sind oder nicht?
Wenn die Funktion in der DLL nicht gefunden wird, gibt GetProcAddress NULL zurück.

In meiner Implementierung gibt eine Warnung, dass der Parameter im aufzurufende Mthode nicht benutzt ist, z.B: pFunc(input64), dass input64 nicht benutzt ist.
Wie lautet die genaue Fehlermeldung, und wie sieht der Code dazu aus?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

es ist keine Fehlermeldung an sich, eclipse eine Warning und wenn man mit dem Mauszeiger darauf geht dann liest man, dass der parameter nicht benutzt wird.

Wegen NULL ausgabe oder die Adresse der Methode, sollte ich irgendeinen Aufruf einbauen damit die Ausgabe in der Consol angezeigt wird? Zum Bsp: irgend ein "printf()"?

Danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

keiner kommt mir heute zur hilfe?

Anstatt dieselbe Frage zu wiederholen (siehe dazu auch die Boardregeln bezüglich "Threadpushing"), könntest du dich fragen, warum niemand antwortet.

Wegen NULL ausgabe oder die Adresse der Methode, sollte ich irgendeinen Aufruf einbauen damit die Ausgabe in der Consol angezeigt wird? Zum Bsp: irgend ein "printf()"?
Im Ernst, was soll diese Frage?

"Ich habe hier eine Funktion, die fehlschlagen kann. In diesem Fall kann mein Programm an dieser Stelle nicht weiterlaufen. Sollte ich diesen Fall abfangen und irgendwie behandeln?"

Selbstverständlich solltest du das.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten morgen mein Retter,

ich denke das habe ich endlich hingekriegt. Obwohl es noch Warnungen gibt wie: "unused variable 'input64' beim Aufruf von pFunc(input64) und "int format, pointer arg(arg2)" beim Aufruf von printf("%d\n", input64)", der Output in der Consol gibt mir irgendeine Zahl: "179013040" was die Adresse der Methode sein kann.

Jetzt versuche ich meinen auf der Seite von Java aufzufüllen und sehen, ob die Berechnung klappt.

Vielen Danke noch für Deine Gedult.

Zonbléou.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich habe noch eine kleine Frage. Meine implementierung gefällt mir nicht ganz aber ich

weiss auch wie man das richtig macht. So habe ich das gemacht. Mein printf() um die Adresse der Methode auszugeben, weiss nicht, ob richtig?

HINSTANCE hIns;

pFunc pFn;

hIns = LoadLibrary("d_cal12.DLL");

pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile");

pFunc(input64);

FreeLibrary(hIns);

printf("Address %d\n", input64);

Sagen Sie mir was falls eine richtige Lösung gibt.

Danke.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe es so geändert: und ich bekomme ein 0 zurück. Soll das heißen, dass die Methode nicht gefunden wurde?

Kann sein. Kann aber auch sein, dass dein input64-Array zu klein ist und die Funktion dir den Stack überschreibt.

Mach die Ausgabe bitte mal zwischen den Aufruf von GetProcAddress und dem Aufruf der Funktion selbst. Wenn da immer noch 0 herauskommt, wurde die Funktion nicht gefunden.

Lass dir zur Sicherheit auch noch den Wert von hIns nach dem LoadLibrary-Aufruf ausgeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich denke etwas stimmt nicht bei meinen Dlls, Ich habe es jetzt so geändert

hIns = LoadLibrary("C:\\Dokumente und Einstellungen\\SBX825\\Desktop\\Rohdata\\d_cal12.dll");

printf("Address %d\n", hIns);

if(hIns)

pFn = (pFunc)GetProcAddress(hIns, "_mcbe_RechneMitZeile");

printf("Address %d\n", pFn);

pFunc(input64);

FreeLibrary(hIns);

Bei printf("%d" , hIns) bekomme ich ein 0 und bei printf("%d" , pFn) bekomme ich eine Zahl: 112223216 egal, ob ich die andere Methode nehme. Wenn ich irgendeine Dll aus jre nehme dann bekomme ich eine Zahl != 0. Alle meine C-dll geben ein 0 zurück.

ich kann das jetzt nicht interpretieren.

Naja vielleicht gibt irgendwann eine Lösung oder auch nicht.

Danke.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei printf("%d" , hIns) bekomme ich ein 0
Dann ist LoadLibrary fehlgeschlagen.

ich kann das jetzt nicht interpretieren.
Die Dokumentation von LoadLibrary hilft:

LoadLibrary Function (Windows)

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Bau also das nach der Ausgabe von hIns ein:

printf("LoadLibrary LastError: %d\n", GetLastError());

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

der Aufruf von gibt als Fehler, das der Pfad oder Verzeichnis nicht gefunden wird.

Jetzt habe ich irgendeine npjava11.ddl aus java jre genommen und genauso in meinem eclipse eingebaut wie die anderen c-dll. Dann habe ich eine Methode aus dieser npjava11.dll mit Dependency-walker gelesen und die Adressen von der Dll und die Methode abgefragt. Ich könnte die beiden Adressen lesen. ich weiss jetzt nicht was mit den anderen c-dll los ist?

Danke.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten morgen,

danke erst, ich wollte die Antwort von gestern Abend probieren. Die dll von java die ich ausprobiert habe liegt in dem selben Ordner wie meine d_cal12.dll trotzdem kann mein programm die finden und die Adresse ausgeben. Aber meine d_cal12 wird nicht gefunden. Wegen Dependency Walker Abhängigkeiten, ich habe die fehlende Dll haute aus Internet heruntergeladen, leider meine MPR.DLL ist nicht vollständig und der Dependency Walker weist diesen Fehler auf:Warning:

"At least one module has an unresolved import due to a missing export function in a delay-load dependent module
.

Mein printf("%d", GetLastError()); gibt 126 aus.

Danke.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...