# Einbinden einer 3rd party DLL via Java Wrapper (JNI)



## haimat (18. Jan 2009)

Hallo zusammen,

ich habe eine Library von einem externen Anbieter, die ich gerne in mein Java-Projekt einbinden möchte. Hierfür wird zu dieser externen Bibliothek auch eine Java-Wrapper-Klasse (JNI) mitgeliefert, um auf die DLL zugreifen zu können. Soweit, sogut. Diese Wrapper-Klasse wurde natürlich ohne "package" erstellt, somit ist auch das JNI Binding der Methoden entsprechend ohne package.

Problem ist nun: Ich kann die Methoden dieser DLL-Wrapper-Klasse in meinem Java-Programm nur ansprechen, wenn die Java-Wrapper-Klasse im default-package ist (was ich natürlich nicht will).

Die Frage ist also: Wie kann man eine externe DLL und die zugehörige Java-Wrapper-Klasse einbinden, wenn diese ohne "package" erstellt wurde, ich aber natürlich schon packages im Projekt verwende? Betonung liegt in diesem Fall auf "externe DLL", weil ich die Java-Header-Datei für JNI nicht selbst neu anlegen kann, weil ich natürlich den eigentlichen C++ SourceCode der DLL nicht habe.

Vielen Dank im Voraus für Eure Hilfe!

Viele Grüße, Matthias


----------



## Wildcard (18. Jan 2009)

Gar nicht, weshalb man auch niemals das Default 'Package' verwenden sollte.


----------



## haimat (18. Jan 2009)

Lieber Wildcard,

wenn du meine ursprüngliche Post gelesen hast, dann ist dir sicher aufgefallen, dass ich sehr wohl geschrieben habe, das "default package" nicht verwenden zu wollen. Hier geht es aber wie gesagt um eine externe Bibliothek, darauf habe ich keinen Einfluss, da ich natürlich keinen Zugriff auf die originären Quelldateien der DLL habe.

Wenn du also keinen konstruktiven Vorschlag hast, dann lass es bitte, denn solche Aussagen wie deine helfen leider gar nicht 

In diesem Sinne...
Viele Grüße, Matthias


----------



## Wildcard (18. Jan 2009)

Das war auch nicht an dich gerichtet, sondern eine allgemeine Aussage. Wenn die Klassen im Default Package liegen und du darauf keinen Einfluss hast, hast du Pech. Ärgerlich, ist aber so.


----------



## Ebenius (18. Jan 2009)

Natürlich kannst Du trotzdem per Reflection zugreifen. Ich würde mir eine Wrapper-Klasse (in einem Package) schreiben, die den Zugriff per Reflection auf die andere Klasse umlegt. Das ist nicht schön, aber wenn Du keine andere Möglichkeit hast, ist es eine funktionierende Lösung.

Grüße,
Ebenius


----------



## Wildcard (18. Jan 2009)

Ebenius hat gesagt.:
			
		

> Natürlich kannst Du trotzdem per Reflection zugreifen.


Sicher?  ???:L


----------



## haimat (18. Jan 2009)

Hallo Ebenius,

das hört sich gut an, danke für den Hinweis. Ich weiss allerdings nicht genau, wie das in dem Fall mit der Reflection umzusetzen ist. Könntest du mir vielleicht einen Ansatz dafür sagen?

Vielen Dank und liebe Grüße, Matthias


----------



## Wildcard (18. Jan 2009)

Da fällt mir aber gerade etwas ein. Wenn du für Java <1.4 Kompilierst, kannst du Klassen aus dem Default Package importieren.


----------



## Ebenius (18. Jan 2009)

Na klar.

Diese Klasse liegt im default-Package: 
	
	
	
	





```
public class Default {

  public static String foo() {
    return "foo";
  }
}
```

Und diese Klasse liegt im package com.ebenius: 
	
	
	
	





```
package com.ebenius;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DefaultPackageAccessor {

  public static void main(String[] args)
        throws SecurityException, NoSuchMethodException,
        ClassNotFoundException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException {
    final Method method =
          Class.forName("Default").getMethod("foo", new Class<?>[0]);
    final String retVal = (String) method.invoke(null);
    System.out.println(retVal);
  }
}
```

Ebenius


----------



## Wildcard (18. Jan 2009)

Jup, gerade auch gelesen:
http://forums.sun.com/thread.jspa?threadID=5360430&tstart=0


----------



## Ebenius (18. Jan 2009)

Cool... Ohne spicken auf die Idee gekommen.


----------



## haimat (18. Jan 2009)

Hallo Ebenius,

genau das wars, besten Dank!

Viele Grüße, Matthias


----------

