R
red99
Gast
Hallo alle zusammen,
ich hab im Zuge der PC-AG unserer Schule ein Spiel geschrieben, bei dem man Spieler in Form von JNI-Wrapperklassen dynamisch über den URL-Klassloader laden kann. Die zugehörigen Delphi-DLLs(nach Anleitung JNI unter Delphi http://www.pacifier.com/~mmead/jni/delphi/) schreiben die anderen PC-AGler. Dann können sie noch die Wrapperklassen, die von einer Oberklasse erben anpassen und kompilieren.
Oberklasse:
eine Wrapperklasse
so wird die Klasse eingebunden:
Das Probelm ist jetzt, dass dies zwar geht wenn sich die Wrapperklasse mit ihrer DLL im Classpath befindet jedoch nicht, wenn sie irgendwo anders ist, was jedoch mit rein java ja geht. Dann kommt folgende Fehlermeldung:
Ich habe den Verdacht, dass es an der Bennennung mit JNI wie Java_Paket_Klassenname_Funktion liegt
Könnte mir bitte jemand helfen.
Vielen Dank schon mal
ich hab im Zuge der PC-AG unserer Schule ein Spiel geschrieben, bei dem man Spieler in Form von JNI-Wrapperklassen dynamisch über den URL-Klassloader laden kann. Die zugehörigen Delphi-DLLs(nach Anleitung JNI unter Delphi http://www.pacifier.com/~mmead/jni/delphi/) schreiben die anderen PC-AGler. Dann können sie noch die Wrapperklassen, die von einer Oberklasse erben anpassen und kompilieren.
Oberklasse:
Code:
public abstract class Native {
public abstract byte[] start(int Index, byte[][] Positionen);
public abstract byte[] zug(byte[][] Positionen);
protected String Library;
protected String Path;
public Native(String Path)
{
this.Path=Path;
}
protected void init()
{
System.out.println(Path+Library);
System.load(Path+Library);
}
}
Code:
public class SpielerTest extends Native {
public SpielerTest(String Path)
{
super(Path);
Library = "SpielerTest.dll";
init();
}
public native byte[] start(int Index, byte[][] Positionen);
public native byte[] zug(byte[][] Positionen);
}
Code:
public Main(String... libs)
{
try {
nv = new Native[libs.length];
for (int i=0;i<libs.length;i++)
{
File file = new File(libs[i]);
File Pfad = new File(file.getParent());
if (!(file.exists()&&file.isFile()))
throw new FileNotFoundException
("Library "+libs[i]+" konnte nicht gefunden werden!");
URL url = Pfad.toURI().toURL();
System.out.println(url);
URLClassLoader uc = new URLClassLoader(new URL[]{url});
libs[i]=file.getName().substring(0, file.getName().length()-6);
Class<?> n = uc.loadClass(libs[i]);
if(n.getSuperclass()==Native.class)
{
c = (Class<? extends Native>)n;
Class clsargs = String.class;
Constructor constr = c.getConstructor(clsargs);
String strarg = Pfad.getCanonicalPath();
if (!(strarg.endsWith("/")||strarg.endsWith("\\")))
strarg+=File.separatorChar;
nv[i] = (Native) constr.newInstance(strarg);
}
}
Positionen = new byte[nv.length][0];
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Das Probelm ist jetzt, dass dies zwar geht wenn sich die Wrapperklasse mit ihrer DLL im Classpath befindet jedoch nicht, wenn sie irgendwo anders ist, was jedoch mit rein java ja geht. Dann kommt folgende Fehlermeldung:
Code:
Exception in thread "Timer-0" java.lang.UnsatisfiedLinkError: SpielerTest.start(I[[B)[B
at SpielerTest.start(Native Method)
at Main.start(Main.java:83)
at GUI.start(GUI.java:327)
at GUI.playTask(GUI.java:314)
at GUI.access$9(GUI.java:306)
at GUI$7.run(GUI.java:301)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Ich habe den Verdacht, dass es an der Bennennung mit JNI wie Java_Paket_Klassenname_Funktion liegt
Könnte mir bitte jemand helfen.
Vielen Dank schon mal