[ERLEDIT]Weiß jemand warum dieses JNI-Beispiel ...?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

[ERLEDIT]Weiß jemand warum dieses JNI-Beispiel ...?

Beitrag von Soner »

(Nachtrag: Im Quelltext hier unten muss ein Fehler stecken, dass ich nicht Finde. Ein anderes Beispiel funktioniert.)

Hallo,
ich habe JNI Beispiel nachgebaut, es funktioniert nicht, sowohl Pascal als auch Java-Programm wird erfolgreich kompiliert. Jedoch beim ausführen meldet JRE das:

Code: Alles auswählen

 
Exception in thread "main" java.lang.UnsatisfiedLinkError: JavaPasDemo.printHelloInJava()Ljava/lang/String;
        at JavaPasDemo.printHelloInJava(Native Method)
        at JavaPasDemo.main(JavaPasDemo.java:14)
 

(Diese Meldung erscheint auch für die andere Funktion aus Pascal-DLL.

Ich habe erst nach Erklärung von hier (http://akini.mbnet.fi/java/jni/) mein Beispiel erstellt als es zu erwähnten Fehler kam, habe ich nach Freepascal-Wiki (http://wiki.freepascal.org/Using_Pascal_Libraries_with_Java) umgebaut. Es funktioniert trotzdem nicht.
Weiß jemand warum es nicht funktioniert?

Das ist Pascal-Bibliothek:

Code: Alles auswählen

 
library PasJniTest;
 
{$mode objfpc}{$H+}
 
uses
  //Classes
  jni;
 
//von fpc-wiki-Using_Pascal_Libraries_with_Java
function JStringtoString(PEnv: PJNIEnv; Obj: JObject; JavaStr: JString) : String;
begin
result  := (PEnv^^).GetStringUTFChars(PEnv, JavaStr, nil);
 (PEnv^^).ReleaseStringUTFChars(PEnv, JavaStr, nil); // release memory to avoid memory leak
end;
 
function StringToJString(PEnv: PJNIEnv; Obj: JObject; const AString: PChar): JString;
begin
  Result := (PEnv^^).NewStringUTF(PEnv, PChar(AString));
end;
 
 
procedure Java_PasJniTest_printHelloInPascal(PEnv: PJNIEnv; Obj: JObject; AMessage: JString); cdecl;
var s:string;
begin
  s:=JStringtoString(PEnv, Obj, AMessage);
  WriteLn('Message from JVM:'+s);
end;
 
function Java_PasJniTest_printHelloInJava(PEnv: PJNIEnv; Obj: JObject): JString; cdecl;
begin
  Result:=StringToJString(PEnv, Obj, 'Hello from FreePascal');
end;
 
exports
Java_PasJniTest_printHelloInPascal,
 Java_PasJniTest_printHelloInJava;
//printHelloInPascal name 'Java_PasJniTest_printHelloInPascal',
//printHelloInJava name 'Java_PasJniTest_printHelloInJava' ;
end.
 


Das hier ist Java-Programm:

Code: Alles auswählen

 
public class JavaPasDemo{
 
  public static native void printHelloInPascal(String str);
  public static native String printHelloInJava(); 
 
  static{
    System.loadLibrary("PasJniTest");
  }
 
  public static void main(String[] args){
    JavaPasDemo sd = new JavaPasDemo();
    System.out.println("Pascal JNI Demo");
    sd.printHelloInPascal("Hello Pascal from Java");  // Hier: java.lang.UnsatisfiedLinkError ...
    String s = sd.printHelloInJava();                 // Hier: java.lang.UnsatisfiedLinkError ...
    System.out.println(s);
  } 
}
 


Das SimpleDemo-Beispiel aus hier funktioniert:
http://akini.mbnet.fi/java/jni/

(Hier findet ihr einfachen aber sehr guten Java-Editor. Mann kann einfach Java-Quelltext laden und ausführen klicken ohne etwas einstellen zu müssen. http://www.javaeditor.org)

Ich lade den Quelltext hoch:
Dateianhänge
PasJniTest.zip
Quellttext von Pascal JNI-Test
(24.32 KiB) 130-mal heruntergeladen

Antworten