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: